Since a lock is retaken before sync.Cond.Wait returns, this could
deadlock when the for loop attempts to take the lock again. (Reported
by sanjay.m.)
theirWindow was used outside of the lock, therefore concurrent writers
could overrun the window.
theirWindow was never updated to reflect the data written.
R=dave, balasanjay
CC=golang-dev
https://golang.org/cl/5671084