The "parser" is passed around to avoid cyclic dependencies, but it could be hidden inside a wrapper parser monad.