A protocol based monad implmentation for clojure