Turns a plain memory reference into a foreign object by associating a finalizer - given by the monadic operation - with the reference.
When finalization is triggered by GC, the storage manager will start the
finalizer, in a separate thread, some time after the last reference to the
ForeignPtr is dropped. There is no guarantee of promptness, and
in fact there is no guarantee that the finalizer will eventually
run at all for GC-triggered finalization.
When finalization is triggered by explicitly calling finalizeForeignPtr,
the finalizer will run immediately on the current Haskell thread.
Note that references from a finalizer do not necessarily prevent another object from being finalized. If A's finalizer refers to B (perhaps using touchForeignPtr, then the only guarantee is that B's finalizer will never be started before A's. If both A and B are unreachable, then both finalizers will start together. See touchForeignPtr for more on finalizer ordering.