perf(lexer): Improve lexing performance

## Performance
On a set of (somewhat limited) microbenchmarks, the new lexer is 5.7 - 12.0 times faster than the old lexer when running on the native Dart VM and 3.5 - 7.2 times faster when compiled to JavaScript using dart2js. The compiled JavaScript code for the new lexer is also smaller (around 5.7KB).

### Old lexer (Dart VM)
- ident: => 134,634 ops/sec (7 us) stdev(0.00089)
- ident-path: => 189,842 ops/sec (5 us) stdev(0.00175)
- num: => 165,547 ops/sec (6 us) stdev(0.00386)
- num-double: => 187,188 ops/sec (5 us) stdev(0.00325)
- string: => 153,280 ops/sec (7 us) stdev(0.00392)
- string-escapes: => 93,251 ops/sec (11 us) stdev(0.00153)

### Old lexer (dart2js)
- ident: => 96,183 ops/sec (10 us) stdev(0.00292)
- ident-path: => 141,194 ops/sec (7 us) stdev(0.00166)
- num: => 78,274 ops/sec (13 us) stdev(0.00152)
- num-double: => 89,515 ops/sec (11 us) stdev(0.0012)
- string: => 350,068 ops/sec (3 us) stdev(0.00277)
- string-escapes: => 175,757 ops/sec (6 us) stdev(0.00174)

### New lexer (Dart VM)
- ident: => 1,363,562 ops/sec (1 us) stdev(0.00216)
- ident-path: => 2,119,697 ops/sec (0 us) stdev(0.00877)
- num: => 1,791,153 ops/sec (1 us) stdev(0.04144)
- num-double: => 1,069,566 ops/sec (1 us) stdev(0.0147)
- string: => 1,846,968 ops/sec (1 us) stdev(0.01548)
- string-escapes: => 724,686 ops/sec (1 us) stdev(0.00613)

### New lexer (dart2js)
- ident: => 609,561 ops/sec (2 us) stdev(0.03416)
- ident-path: => 1,010,967 ops/sec (1 us) stdev(0.01642)
- num: => 341,558 ops/sec (3 us) stdev(0.01175)
- num-double: => 590,163 ops/sec (2 us) stdev(0.00624)
- string: => 1,623,178 ops/sec (1 us) stdev(0.00902)
- string-escapes: => 610,847 ops/sec (2 us) stdev(0.00561)