Perform stack unwinding on exit
Perform stack unwinding on exit

This change separates garbage collection from cleaning up temporary
objects (marked by $caller.delete) during premature exit.
The issue addressed by this is that temporary objects should be cleaned
up in LIFO order, while garbage collection should happen in FIFO
order.
The reason for the latter is that aggregated objects should not get
deleted before their host object, because the host might require
those objects in its own destructor.

lonkamikaze/bsda2,lonkamikaze/bsda2