Allow promises to resolve even after the promise itself deallocates

This way, you can pull out its `signal`, and fully expect it to provide a value in the future, even if the original `Promise` has since disappeared.

Also fixed a deadlock in `Promise.await()`.
I prefer the explicit unwrapping. If anything were to go wrong, it'll more clearly highlight where and why.