Change various std.math.isXXX into templates

In short, this changes behaviour in the following ways:

- Allows inlining where previously was not possible.
- Operations on double/float that call these functions stay in XMM registers rather than copied to/from the stack pointer (though DMD passes reals via st(0), no?)

~~The only change I have a question about is the last one.  Restricting copysign to the signature ``R (R, R)`` may not be ideal, as ``float x = copysign(float, double)`` won't work, where as before it would have done.~~

Nevermind, I decided for myself what the better choice was.
Actually, I think I might raise something slightly different.

- Remove the static assert here at this location.
- Move the comment of what is supported/partial support to ddoc along with the long description of std.math (http://dlang.org/phobos/std_math.html)
- Make the above enum members part of ``floatTraits``, so we test:
```
alias F = floatTraits!(T);
static if (F.realFormat = RealFormat.IEEESingle)
{
  /* ... */
}
```

Because some formats we require more information than just the number of mantissa bits to determine the underlying type.

For instance on i386 FreeBSD:
```
double.mant_dig = 53;
double.sizeof = 8;
real.mant_dig = 53;
real.sizeof = 12;
```
The type is really just real80 but limited to double precision.  This is important as the signbit is not in the same location as you would expect for a normal 8 byte double.