Reclaiming memory: hazard pointers vs epochs

Once the queue works, the hard part begins — freeing nodes safely.