signbit: return a boolean value, instead of an Int.

While messing around with generic equality checking based on the
new decode function introduced in the hashing work, I discovered
that LLVM seems to be much better able to analyze expressions that
use signbit when it's boolean and explicitly defined as `x < 0` for
integer values. Since `true == 1` and `false == 0` this is a pretty
benign change, although technically it is breaking. I've wanted to
do this for a while and this seems like as good a time as any.
isnan, isinf, isfinite: improved generic definitions.

Defining isfinite in terms of decompose is simple. It seems good to
insist that only floating-point reals can be NaN – NaN in hardware
is simply an unavoidable reality. For any user-defined type that is
not implemented in hardware, NaN should not exist since operations
that would produce NaNs should raise immediate errors instead.
move hash(WeakRef) into base/hashing.jl also (not needed so early).
isequal, isless: consolidate most definitions into base/comparison{,2}.jl

This isn't really necessary, but I find that I just can't reason about this
kind of sprawling functionality well without being able to see it together.
isequal, isless: only deviate from == and < for floating-points.

This means that far fewer types should ever define methods for the
isequal and isless functions.