Add a bunch of traits to Lexer to make LexerRules more powerful

This is so we can easily handle tokens with more context straight in the lexer_rules! macro.