(defprotocol Buffer
(full? [b] "returns true if buffer cannot accept put")
(remove! [b] "remove and return next item from buffer, called under chan mutex")
(add!* [b itm] "if room, add item to the buffer, returns b, called under chan mutex")
(close-buf! [b] "called on chan closed under chan mutex, return ignored"))