Use custom exceptions in combinators. Refactor.

Also commented out the half-assed optimization which requires extra thought.