refactored Parser type to use an explicit tag

all changes type-driven and "obviously" semantics-preserving
introduced "recursively" combinator

no other API change, and unchanged semantics for all existing client
code