first pass of Outcome as an interface

see the changes to fsm_test.go to see how Deciders would change. 

Instead of manually constructing an `Outcome`, use `f.Goto(state, data, decisions)`,  `f.Stay(data, decisions)`, `f.Terminate(data,decisions)` and perhaps `f.Error(data, decisions)`

/cc @fabiokung  hows this look?