fix lexer bug on empty files, test clean up, keyword provider now a singleton