Destructuring

`fn` and `let` now support destructuring.

As a side effect, we now have non-lazy versions of `take`, `drop`, `partition` and a few other functions needed for implementing this.

There *are* a couple not-so-pretty things in here to make this work:

* ArraySeq, because we want to redefine fn and let very early and `cons` needs it
* various hacks surrounding map (it requires `-iterator` support and returns a continuation, not a seq)