Make copy! methods consistent, fix copy! bugs

`copy!` was doing some thing that surprised me, so I fixed a couple of bugs, standardized the names, and standardized the behavior of all the methods (to what looked like the majority intent across methods -- all happened to seem sensible).

Basics:
* trying to copy more than destination can hold is an error.
* n < 0 is an error
* when n == 0, return dest without checking bounds
* soffs & doffs must be inbounds otherwise

This one surprised me. Did this have a purpose, @carlobaldassi?

What happens when `src` is shorter than `dest`? Does the last byte-chunk not get copied?