add lexer pre/post functions which are called at the start and finish of each lex() invocation: lexer / grammar writers can use these user-defined functions to prepare and cleanup custom lexer attributes, while both PRE and POST callbacks can also decide to produce/modify a lexer token on their own.

```
    this.options.pre_lex = function() {
        // `this` references the lexer object itself
        ...
        // optionally, you may decide to return a token;
        // when you do, this will be the result of the current lex()
        // call and lexer.next() will NOT be called to extract a lexer
        // token from the input stream.
        // When you return a falsey value, e.g. nothing (undefined), then
        // the `lexer_token_id` as produced by lexer.next(), which is also
        // passed to us as the first function parameter `lexer_token_id`,
        // will be used: this means that not returning any token id in
        // this post callback will not modify the lexer token id itself.

        /* return lexer_token_id; */
    };

    this.options.post_lex = function(lexer_token_id) {
        // `this` references the lexer object itself.
        // `lexer_token_id` is the lexer token id as produced by lexer.next().
        // `lexer_token_id` is never FALSE (falsey)
        ...
        // optionally, you may decide to return another token;
        // when you do, this will be the result of the current lex()
        // call after all.

        return lexer_token_id;   // this gives us behaviour identical to having written `return;` or no return statement at all.
    };
```