title: Failure to close channel causes indefinite blocking
body: <p>Here is an example from <a href="http://www.braveclojure.com/core-async/" rel="nofollow">http://www.braveclojure.com/core-async/</a> :</p>
  
  <pre><code>(defn hotdog-machine-v2 [hotdog-count]
    (let [in (chan) out (chan)]
      (go (loop [hc hotdog-count]
            (if (&gt; hc 0)
              (let [input (&lt;! in)]
                (if (= 3 input)
                  (do
                    (&gt;! out "hotdog")
                    (recur (dec hc))  )
                  (do
                    (&gt;! out (Exception. "Not enough payment!"))
                    (recur hc))))
              (do
                (close! in)
                (close! out)))))
      [in out]))
  (let [[in out] (hotdog-machine-v2 2)]
    (&gt;!! in "pocket lint")
    (println (&lt;!! out))
    (&gt;!! in 3)
    (println (&lt;!! out))
    (&gt;!! in 3)
    (println (&lt;!! out))
    (&gt;!! in 3)
    (println (&lt;!! out))
    )
  </code></pre>
  
  <p>If I leave out the channel-closing part, then this code hangs forever, why?</p>