Implement more combinators, DRY code, clean up tests

Combinators that are implemented for now:
1. rule sequences
2. rule alternatives (firstOf)
3. `optional`
4. `zeroOrMore`
5. `oneOrMore`
6. `and-predicate` (`&`)
7. `not-predicate` (`!`)