A GC alarm calls a user function at the end of each major GC cycle.
create f arranges for f to be called at the end of each major GC cycle,
starting with the current cycle or the next one. f can be called in any thread,
and so introduces all the complexity of threading. f is called with
Exn.handle_uncaught_and_exit, to prevent it from raising, because raising could
raise to any allocation or GC point in any thread, which would be impossible to
reason about.
delete t will stop the calls to the function associated to t. Calling delete
t again has no effect.