cleaned up assembler's keyword handling

The various directives are now less hard-coded -- parse rules can be
decorated with @keyword('FOO'), which generates a token type FOO (or
DOT_FOO). There is also an option to suppress keywords, to hackily
disable certain types of directives without modifying the parser.
Information flow from the parser to the lexer has also been cleaned
up a bit.