Greatly improve gen2 root handling.

Before, an object was only removed from the gen2 root list when it was
itself GC'd in a full collection. This meant that a long-lived object
that made it into the gen2 root list stayed there even if it no longer
pointed to any nursery objects or frames.

Now, as we pass through the gen2 roots list, we take note of objects
that no longer need to be there, and slide those that do down to the
start of the list. This keeps it around a constant-ish size, rather
than O(heap size).