Type conversions

Casting and coercions. Adds custom DST coercions for smart pointers. Otherwise, mostly descriptive, with a few bits of tidying up.
It won't be a buffer overrun if the length is less than or equal to 1; it's trivial to get a buffer overrun with `copy_memory` even with a real array, by just passing a length greater than the length of the array.

Also, note that we currently support this `&mut` to `*mut` coercion; I don't think it has caused too many problems in practice.