HashIter::reify now does eager snapshot

There is some instability in the reentrancy of hashiter, so we force
reify to run to completion in lieu of a bug fix.  But hashes are
finite anyway, and not many people are going to want to do short-circuit
lazy evaluation of a list of keys or values, so not a big deal if we
don't support laziness on hashes for now.  This fix enables maps to
reify their input lists frugally rather than greedily, since greedy map
was hiding the reentrancy problem that this patch hides differently.
MapIter::reify is now frugal with input list

Just because a map is in eager context doesn't mean that its input
list should be evaluated eagerly, since loops can terminate early.
We also want to be able to pull lazily from an infinite input list.
Regardless of the demand, we only need to make sure each call into
the closure has just enough values to bind.  Also, there's no point
in preallocating the output rpa when it will be unused in sink context.