Improvements to std.math floor() / ceil()

Some changes are going on here:

1. Uses union instead to ensure that compiler doesn't emit any library calls here (seen a small speed up in benchmarking code).
2. Add float/double overloads, improvements might be negligible because isNaN and isInfinity checks perform (heavy?) conversions to long double.
3. Move common code in floor into floorImpl
4. Converted isNaN and isInfinity into generic functions.  This final change resulted in a substantial improvement of codegen.

> There should be a common union though (floatTraits?) that includes array accessors down to byte[T].

I can raise this in a new PR if it proves to be beneficial (and it cleans up all this float/int casting in std.math).

One thing to note is that unions aren't CTFE-able if I recall correctly.  So it's really a question of whether or not you want isNaN, isInfinity, etc... to be computable at compile-time or not.