We were trying to be clever and respect TCP's notion of half-open sockets, but it causes leaks when we can't unblock io.Copy(). This fixes those leaks and seems to follow most expectations. I think we were just be too clever.