contributions from @kargakis:
* ```frameSender()``` never sends anything down to the ```done``` channel if it normally ends.
* ```receive()``` is unnecessary as it allocates a frame and an error every time it's called and returns them to the ```frameSender()```, while we can easily call ```readFrame``` inside ```frameSender()``` without the extra allocation. Handling of the ```io.EOF``` can also easily be done inside ```frameSender()```. I guess with profiling this allocation issue would be more obvious.
* Drop of ```isConnReset``` since 1) disconnection is still a connection error and 2) it is treated just like other connection errors.
Merged contributions @kargakis