- [x] specifying the initial edges as 1-dir node edges,
    - [x] names,
    - [x] action names (edge names are unique, action names are unique-to-source,)
    - [x] the probability of an edge,
        - [ ] being the most probable edge,
        - [x] following one edge probabilistically,
        - [x] random walks
    - [x] which states are "complete" (that is, that an input sequence can be considered satisfactorily terminal),
    - [x] whether a machine is
        - [x] complete,
        - [x] final (not is_changing, complete, and terminal),
    - [ ] edges as force-only (eg to "off" in the traffic light)
    - [ ] actions as force-only (also eg to "off")
- [ ] the ability to list
    - [x] a node's edges (in/out/both,)
    - [ ] a node's actions (in/out/both,)
    - [x] whether a node is terminal,
        - [x] whether the machine is at a terminal node,
- [ ] to specify for a graph
    - [ ] edge count,
        - [ ] min,
        - [ ] max,
    - [ ] whether to selectively allow change by
        - [ ] action,
        - [ ] transition,
        - [ ] forced transition,
    - [ ] whether to tolerate islands,
    - [ ] whether to links should be 1d/2d/either,
    - [ ] ~~whether the state machine is fixed (not implementing for now,)~~
    - [ ] ~~whether forcing (making a change outside the edge graph) is permitted (not implementing for now,)~~
    - [ ] whether names are `allowed|disallowed|optional`,
    - [ ] whether action names are `allowed|disallowed|optional`,
    - [ ] whether states may be in more than one group,
- [ ] to enforce for a graph
    - [ ] edge count,
        - [ ] min,
        - [ ] max,
    - [ ] change allowed by
        - [ ] action,
        - [ ] transition,
        - [ ] forced transition,
    - [ ] island tolerance,
    - [ ] link 1d/2d tolerance,
    - [ ] ~~state machine fixedness (not implementing for now,)~~
    - [ ] ~~forcing permission (not implementing for now,)~~
    - [ ] names `allowed|disallowed`ness,
    - [ ] action names `allowed|disallowed`ness,
    - [ ] edges multiple group tolerance,
- [ ] ~~for non-fixed machines, (not implementing for now,)~~
    - [ ] ~~to add edges~~,
    - [ ] ~~to remove edges~~,
    - [ ] ~~to remove nodes (and thus all the related edges,)~~
    - [ ] ~~to have a sane way to validate afterwards~~
- [ ] attached data,
    - [ ] which is transactionally applied,
    - [ ] which is available to all validation hooks,
- [ ] validation hooks on
    - [ ] walking an edge,
    - [ ] entering/exiting a node,
    - [ ] changing data (which can happen with or distinctly from a transition, but always atomically w/ validation),
- [ ] notification hooks on
    - [ ] any change,
    - [ ] enter/exit a node,
    - [ ] walk an edge,
    - [ ] execute a named action,
    - [ ] data change,
    - [ ] init,
    - [ ] non-matching event
- [ ] timers (todo needs fleshing out)
- [ ] language support?
    - [ ] promise support?
    - [ ] generator support?
    - [ ] observable support?
    - [ ] async await support?
- [x] the ability to generate
    - [x] flowchart representations
        - [x] as DOT strings
        - [ ] prolly using viz.js (graphviz emscriptened to yerbaschmidt)?
    - [ ] uml statechart representations?
    - [ ] sdl representations?
    - [ ] nfa representations? (see comments below, thanks @patater)
    - [ ] drakon representations?
        - [ ] from within gviz/viz.js?
    - [ ] harel statecharts?
- [ ] the ability to
    - [x] save a state machine state,
    - [ ] load/create from a state machine state,
    - [ ] validate an abstract state machine state,
    - [ ] keep and rewind a state history (thanks @kz),
    - [ ] autocreate an api (that is, action "melt" on machine auto-gets api method equiv `.melt()`)
        - [ ] with optional prefixes
    - [ ] consume `.dfa` files?
    - [ ] compare two state machines?
    - [ ] check `is_changing`
    - [ ] describe edges as members of groups
- [ ] improved nature of states (all thanks burny who isn't on gh zomg)
    - [ ] states as objects rather than strings
        - [ ] makes inheritance easier
        - [ ] makes heirarachy easier
        - [ ] makes state-associated data easier (eg walking state now has frame#)
        - [ ] makes underlying impl much harder
    - [ ] state subtypes
    - [ ] heirarchal states
        - [ ] triggered by subordinate on transfer callback to superior
        - [ ] "or polling"
    - [ ] multiple concurrent states (keanu mind blown.gif)
- [ ] for convenience,
    - [ ] a fluent api for creation
    - [ ] a DOT-like string api for creation,
- [ ] in background,
    - [ ] transition probability long-term measurement
    - [ ] state probability long-term measurement
- [ ] sanity checks
    - [ ] `initial_state` must be a valid `state`

difference between event and action: if action isn't handled, it's an error; if event, meh
