                                   :in<->ex-sock in<->ex-sock
                                   :->zmq-sock (:rhs in<->ex-sock)
                                   :async->sock (:lhs in<->ex-sock))
-            ;; I'd prefer to start the async-loop first.
+            ;; I'd prefer to start the zmq-loop first.
             ;; It seems cleaner, and I'm not positive which
             ;; bullets I might have been dodging.
             ;; However:

            ;; async-loop throws an exception, I have to restart
            ;; the JVM to free up the socket that zmq-loop has bound
            ;; (assuming that we're binding).
            async-loop (run-async-loop! almost-started)
            ;; TODO: Still want to clean things up if an exception
            ;; gets thrown
            zmq-loop (run-zmq-loop! almost-started)]
        (assoc almost-started
               :async-loop async-loop
               :zmq-loop zmq-loop))))
  (stop [this]
        (when async-loop
          (do-signal-async-loop-exit async-loop

  But then we could have one thread trying to read while another tries to write,
  and that's a recipe for disaster."
  [{:keys [async->sock in<->ex-chan interface _name stopper] :as component}]
  {:pre [#_(s/valid? ::event-loopless-pair component)]
   :post [(s/valid? :com.frereth.common.schema/async-channel %)]}
  ;; I'm leaving this around because it is extremely useful for debugging problems.
  (comment) (validate-component component)
  (let [{:keys [in-chan status-chan]} interface
        in-chan (:ch in-chan)
        status-chan (:ch status-chan)
