StateT[IO, S, ] - это моральный эквивалент S => IO[S, A], иными словами писать функцию
def foo(...): StateT[IO, S, A]
эквивалентно написанию
def foo(...)(init: S): IO[(S, A)]
Это форма функционального стейта, но строго линеаризованного и теряющегося при первой же ошибке.
Ref, MVar, Ref, Queue, Atom, Agent - формы мутабельного состояния и обмена информацией для конкурентных программ