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

Another thing to consider is that it might be better to test actual tasks, rather than an iterable that's only used here.