ServerSocket::accept will not time out on Unix which would result in a call to TelnetAppender::close() or SocketHubAppender::close() stalling waiting to join with the connection monitoring thread. The problem appears to be inconsistent behavior of blocking socket IO with timeout between platforms.
To address the problem, ServerSocket was rewritten to use non-blocking IO with polling. ServerSocket and Socket were essentially wrappers around SocketImpl. With the change of ServerSocket to use non-blocking IO, it was expedient to remove SocketImpl and to split the appropriate parts between ServerSocket and Socket and remove unused code like Socket::read.