Move compact_hash_table before xml_allocator.

This helps streamline class dependencies and will make subsequent changes
smaller.
Split hash table operations into reserve and insert

Insert is now unsafe - since we don't have a way to handle rehash()
failures transparently we need to reserve space beforehand. Reserve is now
called before every tree-mutating operations and it guarantees that we
can perform 16 arbitrary pointer mutations after that.

This fixes all test crashes with compact mode.
tests: Reenable all tests for compact mode