refine and cleanup handling of range arithmetic
Try to be more careful about which types we use for arguments and return
values and comparisons in intermediate computations. Not expected to
change nominal behaviors, but may improve some unusual ranges that
require some conversions or are near over/underflow.
And use convert(T,1) rather than oneunit(T) to support fewer types, as
we want the default step to be a unitless 1 (e.g., not Nanosecond(1)).
Replaces #43058