Implement proper shading

This commit sucks, because it's too big.

OK, so the main innovation is that the library now internally uses
`BigDecimal` instead of `Float`, because `Float` wasn't giving me nice
precision.  I had to change a bunch of existing tests, because with help
of `BigDecimal` Colir calculated hexes more accurately.

Why do we even need precision? Well, to tell the truth I didn't manage
to achieve 100% precision for internal calculations without tricks. Now
we have the `@hsl` ivar, because without remembering the first HSL it wasn't
possible to achieve flawless precision. For example, darkening a colour
and immediately lightening it were producing different saturations
(given a colour of 0x123456 the initial saturation is 0.65, after
darkening and lightening it, the saturation becomes 0.66, because of funny
floating point arithmetic (or my incompetence, haha)). Storing `@hsl`
allows us not to recalculate the saturation and the hue: the only real
dynamic attribute is the lightness.
HSLRGB: simplify `::rgb_to_hsl`
HSLRGB: fix some documentation
HSLRGB: don't overuse `BigDecimal`
Colir: correct the yield value docs
Colir: refactor `#hexa`
Colir: write up some explanation of the constants
Colir: implement `#reset_shade`