Fix breakage I caused with a previous refactoring.
The procedures hash-table-update! and hash-table/modify! were not equivalent, as
I blindly assumed during the refactor. Changing hash-table-update! to use the
same implementation as hash-table/modify! caused the unit tests to fail, because
that implementation couldn't implement the tested behavior.
Rather than try to fix the implementation, I reverted hash-table-update! to its
previous implementation. The rationale for this is that fixing the implementation
would effectively eliminate its performance advantage, while still being hard to
understand. The older implementation is trivial to understand and eliminates
the restriction that the update procedure not use the hash table.
An additional complication arose because the previous implementation of
hash-table-update! returned an unspecified value, which broke hash-table-intern!
and caused hash-table/modify! to differ from its previous behavior. I fixed
these by rewriting them without using hash-table-update!.