Optimize push and unshift.

Often we're just dealing with single items, so add multi candidates
that efficiently handle that case. Need to take a lot of care to get
flattening right. Also some small optimizations in the multi-item
code paths.
Optimize for 1..100000 { } loops into while loops.

This pattern shows up especially often in benchmarks, but can crop up
in various bits of real-world code also.