clojurescript state machine library