Fix template recursion issue

If two objects A and B refer to each other, the R! template evaluation
loops, trying to evaluate R!A while evaluating R!B. isNumericType
encounters an incomplete type and static asserts.

However, checking if the type is a class or struct still works as
normal. So, the isNumericType check has to be at the end of the list,
and short circuit evaluation protects it from recursive weirdness.

OR SOMETHING. Frankly I don't understand the issue at all, and it
suggests something is structured incorrectly. Template constraints must
be in a particular order? Ugh. No. Bad. Smells like C++. That's not how
D is meant to work.