util/hash_table: add DERIVE macro
we typically use a hash table with a fixed struct key, but this requires tedious boilerplate. add a macro that generates all the boilerplate for you so you can just create a table and go.
naming inspired by Rust #![derive].