Fix Issue 11787 - std.complex should have a separate Imaginary type.

The rationale for a separate imaginary type has been laid out in Kahan
& Thomas, "Augmenting a programming language with complex arithmetic",
http://www.eecs.berkeley.edu/Pubs/TechRpts/1992/CSD-92-667.pdf

In total this patch implements:

  * The Imaginary type;

  * imaginary-numeric operations via Imaginary.opBinary, and numeric-
    imaginary operations via Imaginary.opBinaryRight

  * complex-imaginary operations via Complex.opBinary, and imaginary-
    complex operations via Complex.opBinaryRight;

  * abs and arg implementations to support Imaginary.

A broader range of imaginary-supporting functions (e.g. sin, cos, etc.)
are not yet implemented; this will be done conditional on acceptance of
the general design.