Well-formedness checks for finite state machines.
FSM is well-formed if all its actions are the same length,
none of its actions contain destinations which are out of range,
and it is not disjoint.
|BadLengths [(sy, Int)]|
|BadActions [(sy, Action)]|
The FSM is disconnected, i.e. not even weakly-connected.
Carries a list of its weakly-connected components (each is a
Given an FSM, normalise it and check it's well-formed.
This should be called whenever an FSM is read/computed from an outside source. If parsing, the right time to call this is immediately after you've decided if the parse of the FSM was successful or not. (In other words, here are some static checks!)