split Addr and log declarations into their own files.
add new struct to hold connection components.  assumes all conversations are json.

this will add several forms of leverage: it makes an api that client can use in place of net.Conn to have transparent support for inprocess communications as well as sockets (which we could have done by implementing net.Conn as well, but this works too), and more importantly it makes it graceful for us to set up json encoders and decoders around the stream once and then pass around the whole thing -- which means we can set up the connection and codec once, then ask that decoder for different types of message throughout the program, and never futz about with unbuffering the bits from a last decoder into the new one, which we'll use when client starts to need a more stateful protocol with different message types as handshakes to separate hosts from daemons comes up.
switch client to use siphon.Conn in place of net.Conn
add mutexes to force serial access to encoders and decoders in siphon.Conn.

this is necessary already since the signal handling in the client that sends resize messages after WINCH sigs runs in a separate goroutine than the normal keyboard handling for the client.