conn: make public
reader/writer: consolidate into conn
reader: add heartbeat_interval to Configure()
reader/writer: add output buffering options
reader/writer/conn: move timeout and connect responsibility
reader/writer: move read loop into Conn
reader: separate configure
reader/writer: use callbacks rather than channels