Even when no finalizer is specified, but only a mark function is, we
have to make sure we register one. This is needed because the
finalization will cleanup C-API handles so they aren't kept alive
when the shouldn't.
This is especially a problem if during a young GC we have to update
marks for Data objects that are mature. It could be that the mature
object we're marking then has already been finalized, so we shouldn't
try to mark it again in that case.
This is ensured by this change because it will deallocate the handle, so
the code tracking all handles to mature objects to call the mark
function won't see the finalized object.
Fixes the crash mentioned in #2118