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.
Anything that's going to be sufficiently descriptive is going to be longer, so not only do you have to replace all the constant, you also need to fix formatting.
You're not likely to do that by hand so you use a formatter, except it's now you've introduced more than just constant replacements into the diff.
If you're reading/modifying this module you're likely to recognize the constant without issue.
I understand the general idea that magic numbers are bad, but lets exercise some pragmatism in this case.