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.

Conflicts:
	std/variant.d
Use VariantException instead of a bare Exception.
Use positional arguments for format().
Don't throw static exceptions.
Code clean up.
Merge pull request #2452 from s-ludwig/issue_13352

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