remove bigfloat dependence from rationalize

This implements `rationalize` without `widen`ing the argument (e.g. `Float64` to `BigFloat`), and so is a fair bit quicker. 

Also the tolerance parameter is now more precise: it bounds the actual difference between the float and rational (the current behaviour bounds the difference after the rational has been converted to float). Note that this also means that `convert(Rational{T}, x)` will return the exact value if it is representable, e.g.
```julia
julia> convert(Rational{Int64},0.1)
3602879701896397//36028797018963968

julia> ispow2(ans.den)
true
```

cc: @nolta @StefanKarpinski 
Everything happens top to bottom, left to right. In `A = B`, if `B` throws an error then no assignment happens. Everything before that statement will have run completely though. Ensuring this comes at a performance cost for variables used this way with try/catch.