Destroys a GameObject after a number of seconds. If the GameObject or its children have any
components that implement ITemporaryEffect we will wait for those to be finished before destroying.
This is particularly useful if you want to delete a GameObject but want to wait for sounds or particles
to conclude.