Generalized lexer to accept any array of token classes

Subclasses supply a list of tokens for their language in the constructor