Color space conversions previously operated on Color's `u8` components,
losing precision at each intermediate step. Introduce a
`ColorComponents` class that stores components as floats, and move all
conversion logic into free functions that operate on `ColorComponents`.