Internal state is managed by the hashmap to populate buckets with linked lists.
hashmap_keyval nodes are allocated as needed; however, free'ing of those
structs can not be done immediately during a hashmap_del call. Other threads
may be concurrently using the hashmap_keyval.
hashmap_del may return a value. It will only do it once per delete, and the
calling thread must buffer the pointer for appropriate later cleanup. It can
not immediatley be free'd because other threads may also be using the same
pointer.