more CLJS state machine optimization

the switch statement was in a cond in a let binding, this meant that
clauses of the cond were in an expression context creating many
superfluous closures. Instead lift the switch into its own function
and call it. The switches now compile to efficient if/else returns.

both Node.js and WebKit Nightly can run the Go 100000 channel daisy
chain in around 1 second on my machine putting us within 5X of the
core.async for Clojure JVM. For Node.js simply calling setImmediate
100000 times takes ~350ms so we're doing pretty good.