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.
It could be a serious problem that defining `<` and `promote_rule` for new types is no longer sufficient to get these kinds of cases to work. Maybe the new `(Real,Real)` fallbacks should use `Union(Rational,FloatingPoint)` instead? Or maybe we need a new `Fractional` type between `Real` and `Rational` (and `FloatingPoint`)?