Add asserts in Copy (and remove an enforce)

Adding extra asserts always helps. As for the enforce, I'm unsure why it was there in the first place: All the other branches simply make the assumption the target is large enough.
Make move CTFEable for simple structs and classes

memcpy is not CTFEable, so avoid it for structs without
dtor, postblit that can be assigned with plain =.

This leaves as is (compile error in CTFE) structs that contain
immutable/const memebers the fact that moves overwrites such
fields is questionable to begin with.
Merge pull request #2036 from blackwhale/ctfe-move

Make move CTFEable for simple structs and classes
Clarify DDoc of hasElaborateAssign

Split the overly long sentence in two, otherwise
it's easy to miss the point about auto-generation.
Merge pull request #2056 from blackwhale/elaborate-assign

Clarify DDocs of hasElaborateAssign
Merge pull request #2052 from monarchdodra/copyAssert

Add asserts in Copy (and remove an enforce)
Re-implement reduce.