Refactor weak-reference handling code in SGen

There are a few tables of GC handle data in `gc.c`, whose information was being duplicated by the hash tables in `sgen-fin-weak-hash.c`. Removing these hash tables and using the handle table directly is both simpler and considerably more efficient.

To do:

 * Reinstate the segregation of weak links by minor vs. major heap
 * Remove the need to make the GC lock recursive

CC @schani