These functions generalize their namesakes in the portable
Foreign.ForeignPtr module by allowing arbitrary IO actions
as finalizers. These finalizers necessarily run in a separate
thread, cf. Destructors, Finalizers and Synchronization,
by Hans Boehm, POPL, 2003.

Turns a plain memory reference into a foreign object by associating
a finalizer - given by the monadic operation - with the reference.
The finalizer will be executed after the last reference to the
foreign object is dropped. There is no guarantee of promptness, and
in fact there is no guarantee that the finalizer will eventually
run at all.

This function adds a finalizer to the given ForeignPtr.
The finalizer will run after the last reference to the foreign object
is dropped, but before all previously registered finalizers for the
same object.