cleaning up some list methods: making reverse() be
linear instead of quadratic in allocation usage, and making take() and
drop() report out-of-range arguments more informatively