I agree. I was very careful with locking (and spent a long time debugging deadlocks and race conditions).

The reason I didn't use ```defer``` in conn.go is to speed up the lock observation. As we are taking the write lock I didn't want to leave the lock locked for the whole function call when in reality the only thing the lock protected was setting ```isClosed``` so it was sufficient that all other callers check ```isClosed``` and end up not racing each other.