Like Core.Weak_hashtbl, but automatically collects keys with unused data, rather
than requiring user code to call remove_keys_with_unused_data.
key_is_using_space t key returns true if key is using some space in t. mem t
key implies key_is_using_space t key, but it is also possible that that
key_is_using_space t key && not (mem t key).
reclaim_space_for_keys_with_unused_data t reclaims space for all keys in t whose
data has been detected (by a finalizer) to be unused. Only keys such that
key_is_using_space t key && not (mem t key) will be reclaimed.
set_run_when_unused_data t ~thread_safe_f calls thread_safe_f in the finalizer
attached to each data in t, after ensuring the entry being finalized will be
handled in the next call to reclaim_space_for_keys_with_unused_data. This can be
used to arrange to call reclaim_space_for_keys_with_unused_data at a convenient time
in the future. thread_safe_f must be thread safe -- it is *not* safe for it to call
any Weak_hashtbl functions.