Fix Map and Set iterator logic

Summary: The iterator logic for Maps and Sets was keeping track of the current
element using byte offsets instead of indicies, which was intended to be a
micro-optimization to make iter_key() and iter_value() slightly faster.
However, it turns out that ArrayIter truncates the upper 32-bits, so the
byte offset scheme won't work for huge collections with more than 178956970
elements.

This diff changes the Map and Set iterator logic to use indices instead of
byte offsets. This has the added advantage that it matches how MixedArray's
iterator logic works.

Reviewed By: @paulcavallaro

Differential Revision: D1428664