Imaginary: implement a pure Imaginary type, let `im = Imaginary(1)`.

Note that this now includes the changes for https://github.com/JuliaLang/julia/pull/5466 since they were necessary to get some of the promotion stuff here to work correctly.