Refilled the comments to 80 characters
Tiny improvements
Simple but important refactors

Stopped using the 'goto TryAcquire' idiom, since it is weird. Also I was
using the same label in multiple locations, so I think it was broken.

Moved Bucket and TableInfo definitions to before the hazard pointer, so
the hazard pointer could be a TableInfo** rather than a less clear
void** pointer.

Used std::unique_lock in some places rather than manually locking and
unlocking.

Used unique_ptr for old_pointers list, so that they are destroyed
automatically. Also simplified the delete_unused function.

Changed the i++ (and similar increments) to ++i, since it's more
efficient.
Fixed the Bucket code, some safety issues, and a couple small fixes

The in-place construction and destruction wasn't actually correct, since
the arrays called the destructors of each of their members upon Bucket
destruction, which would result in a double destruction.

Instead, we use arrays of aligned_storage objects, so that the
array destructor does nothing. This means we don't need to use custom
allocators, so we replaced the bucket pointer with a vector.

Also replaced arrays with std::array, and a few pointers with
unique_ptrs.

Also started using unique_lock in some places.
Replaced -O4 with -O3
Fixed delete_unused

The remove_if condition was the opposite of what it should be.
Fixed snapshot_table

It was riskily written