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()`.