golang fsm interfaces