Currently, ST actions are instantiated at s = RealWorld when
run. We'd really like to treat ST and IO somewhat differently
for demand analysis, which means we need to have a way to distinguish
them. The most conservative option seems to be to use a different
State# token type.
This commit experimentally (and with a big hammer) adds a new
FakeWorld primitive type, a fakeWorld# :: State# FakeWorld
primitive token, and a runFW# (run in a fake world) token.
It then uses runFW# to implement runST. Let's see what happens.