Array destructuring should use iterators

The assignment

  [x] = obj;

should desugar to something like:

  $tmp = obj,
  $iter = $tmp[Symbol.iterator](),
  $iterResultObject = $iter.next(),
  x = $iterResultObject.done ? undefined : $iterResultObject.value;
  obj

When you add holes, spread and default initializers it gets even
hairier.

Fixes #840
I don't understand these two results. The `assert` on line 16 tells us `i === 8`.  On line 19 we enter `f()`, skip the loop and return `undefined`.  Thus I would expect `x === undefined` and `i === 8`.  Where do I go wrong?