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.
Remove Imaginary this, opAssign and opEquals taking Complex argument.
arg of Imaginary should return nan if imaginary part is nan.
Simplify method attribute declarations.
Add Complex.opEquals for imaginary types.
isIdentical seems to fix imaginary == numeric opEquals.
Let's see if we can avoid FP equality unittest failures.
Refactor Complex.opBinaryRight to avoid modification of return value.
Place imports in innermost scope possible.

First (?) follow-up to discussion here:
http://forum.dlang.org/post/l8t4no$mg3$1@digitalmars.com
Merge branch 'master' into imaginary

Conflicts:
	std/complex.d

Bringing imaginary up to current master