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

The dozen or so tests rely on the task being identical each time (`start(::Tsk)` refreshes the underlying task). Maybe creating a simpler iterable without a `length` and that mutates in `done` (but that would lose the familiarity of tasks)?