Reduce data loss in overflowing and ring channels.

Explicitly prefer to write out old data if available, rather than letting
Golang's scheduler choose whether to read or write. When both directions are
ready, a naive select block chooses randomly, which leads to unnecessary dropped
data 50% of the time.