Imaginary: implement a pure Imaginary type, let `im = Imaginary(1)`.
test/complex.jl: add tests that `a + b*im === Complex(a,b)` always.
improved hashing of purely imaginary numbers?
move ^ definitions to end of base/rational.jl to avoid ambiguities
complex: consolidate and simplify imaginary and complex promotions.
const im = Imaginary(true) instead of Imaginary(1)