FIX: Correct arithmetic operations

Fixis issues found in the discussion of #240:
Arithmetic operations are now done in their native datatype and only
casted if an overflow happens. This leads to better precision in results.
Also, hex strings are now allowed to have a sign (+ or -) if (and only if) they are
used in arithmetic operations.
Same would then apply to the case if one operand is long and the other wouldn't fit in long.
And here's again a thing: While `[long]::maxValue + 1` results in a `double`, as specified, the operation `0 + 9223372036854775808` results in a value of type `decimal`, not `double` (the number is the value of `long.MaxValue + 1`)... *sigh*