fix float vs rational comparisons

This (should) fix `FloatingPoint` vs `Rational` comparisons (mentioned in #2960 and #8411), and should be easily extendable to other binary `Real` types such as [FixedPointNumbers.jl](https://github.com/JeffBezanson/FixedPointNumbers.jl).

It does change the dispatch of comparison operators considerably, so there is a chance that this could break something, or cause a performance regression.
`x > 0` should work for every type; `zero(x)` should not be necessary there. Usually it will use promotion, but for example GMP has functions for comparing against small integers that we should use.