Fix issue #13352 - Only perform Algebraic arithmetic with allowed types.

Adds a static check allowed!T before trying any particular numeric type. Also checks for an exact type match in case of a raw (non-Variant) operand and prefers that to one of the fixed numeric types. Finally, it loosens the restriction for opArithmetic to only work for equal Variant types.

https://issues.dlang.org/show_bug.cgi?id=13352
Yeah, sorry, too much D1 in my life these days >_<

> It's not as simple as it's done here. We need to make sure the chaining mechanism supports it in a reasonable manner.

I know it is not simple but I disagree that recursive chaining is something worth supporting. I'd much prefer the other path - prohibiting recursive chaining of exceptions completely (detecting it in runtime and throwing terminal Error instead)