It's interesting to contrast this design with what Rob Pike presented in his talk on the Go template lexer. Some differences:
(1) Pike's is more static: there is no Machine struct and states are identified with handlers so that there is no table lookup in the loop.
(2) Pike chose to go with a modifiable lexer struct rather than threading a cargo value through the machine.
(3) Pike used nil for all end states.
The main design questions are probably:
(a) Do you need to construct machines at runtime?
(b) Do you need state names available at runtime?