interface for actions to be taken when gc'ing objects that are no longer
reachable.
This is meant to be used for types that have native companion objects
which need to be cleaned up. We can't use Object.finalize() for this because
this can be overridden in user code, and actually can make objects live again