Step validation fix with tests

Step validation fails for valid changes under certain conditions, due to
floating point rounding errors. For instance, 33.34 * 100 will yield a
value very close to 3334, but slightly above it and will never equal
3334 exactly. This somewhat fixes this by making less strict checks
(modulus should be within a certain tolerance of zero, and the tolerance
could be increased if for some crazy reason someone wanted more
precision).

This also allows the step parameter to have the 'any' value, which is
valid according to the HTML5 spec.