Make sure we reinitialize let bindings in loops.

In case we had a let bindings without an initializer inside a loop,
make sure we initialize it to undefined.

Fixes #1567
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