Run a lazy
State effect, yielding the result value and the
final state. More programs terminate with lazy state than strict
state, but injudicious use of lazy state may lead to thunk buildup.
runState s (pure a) = pure (s, a)
runState s get = pure (s, s)
runState s (put t) = pure (t, ())