simplify tokenizer contract: don't return already parsed tokens if there's an error -- just the error information
simplify parser contract: either parse entire token stream, or fail with an error