Effect interpreter

Interpreter registers effect factories keyed by (state, event). Each factory returns a fresh Effect (effects are not Clone).

#![allow(unused)]
fn main() {
use id_effect::{Effect, run_blocking};
use id_effect_fsm::{Interpreter, StateMachine, TransitionTable};

let interp = Interpreter::new().on_transition("idle", "tick", || {
    Effect::new(|_| Ok(()))
});
let mut m = StateMachine::new("idle", table);
interp.run(&mut m, ["tick"], ())?;
}

Use run_blocking at the application boundary — the same rule as other synchronous IO in effect! blocks.