Add a nondeterministic finite state machine

In this change we take our work on the DFA and build on it to create a
non-deterministic variant, aka a NFA. Where the DFA has only a single
current state the NFA can hold multiple in parallel.