runWith allows running an STrans program with an initial environment,
which must be consumed.
It's only allowed in the IO monad, because it's inherently unsafe, so
we don't want to be able to use it under a 'lift' in just any ST program -
if we have access to an 'Env' we can easily duplicate it - so it's the
responsibility of an implementation of an interface in IO which uses it
to ensure that it isn't duplicated.