func (p *loggingPipe) clientConn() *loggingConn {
	return &loggingConn{
		pipe: p,
		r:    p.clientReader,
		w:    p.serverWriter,
	}
}
func (p *loggingPipe) clientConn() *loggingConn {
	return &loggingConn{
		pipe: p,
		r:    p.clientReader,
		w:    p.serverWriter,
	}
}
// clientConn returns a loggingConn at the oposite end of the loggingPipe as
// serverConn. There is no fundamental difference between the clientConn and
// the serverConn, as communication is full duplex, but distinguishing the two
// ends of the pipe as client and server, rather than e.g. left and right,
// hopefully makes the calling code easier to read