Something of a rewrite:

* Allow choice of how much size to "eat" each time we descend
* Fix at least one more recurse-indefinitely bug
* Try to reduce the amount of copying we do, and use more efficient techniques
* Add some tests