2.1.5
Namely, we don't require that a number be exactly representable as a single precision float anymore (this requires many `Math.fround` calls). There is no precision loss risk (compared to the `long` use-case, which requires explicit bounds), since we actually get bonus precision (via JavaScript's use of doubles); we simply transparently return back to floats when serializing. Also change how boolean validity checks are performed (equivalent but likely a bit more efficient).