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

I just double checked that the else clause below preserves/updates the right portions of the final byte chunk.