add basic pairing
fix massive bug in number authorization

channel filtering is counterintuitive, especially since clojure gets you
used to working with immutable objects.

  (let [c (range 10)]
    (println "Odds:" (take 5 (filter odd? c)))
    (println "Evens:" (take 5 (filter even? c))))

  ;; output:
  ;;
  ;; Odds: (1 3 5 7 9)
  ;; Evens: (0 2 4 6 8)

  (require '[clojure.core.async :refer [<!! filter< to-chan]])
  (let [c (to-chan (range 10))]
    (println "Odds:" (take 5 (repeatedly #(<!! (filter< odd? c)))))
    (println "Evens:" (take 5 (repeatedly #(<!! (filter< even? c))))))

  ;; output:
  ;;
  ;; Odds: (1 5 7 nil nil)
  ;; Evens: (nil nil nil nil nil)

This makes sense given the way that channels work--they are opaque, so
you can't see whether the next item in the channel will pass the
predicate until you pop it off, and you have no way of skipping past
items in the channel that *don't* pass without popping them off the
channel. Nevertheless, it can be a bit confusing. Note also that
repeatedly creating the same filter channel, like `(filter< odd? c)`,
will pop successive values off of the original.