Restrict backtracking in parser using "commit"

This improves both error reporting and efficiency.

Idea ripped unceremoniously from:
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.135.7512&rep=rep1&type=pdf