Currently we have self destruct called after return_value or return_void. This is problematic because we need the promises continuation for final suspend, so self destruct should happen in the destructor which is the last thing to execute when a promise is destroyed. This also adds the benefit of having a destroyed/cancelldd promise unwinds itself on the coroutine stack.