Use closures instead of exec and attach location info when we *do* exec()

This pull request does two things:
 * replace usage of exec() with closures instead (for lexer and parser rule callback functions)
 * preserves and attaches location information when executing code SECTIONs (following the '###') from grammars