code: func (conn *Conn) recv() {
  	for {
  		s, err := conn.io.ReadString('\n')
  		if err != nil {
  			if err != io.EOF {
  				logging.Error("irc.recv(): %s", err.Error())
  			}
  			// We can't defer this, because Close() waits for it.
  			conn.wg.Done()
  			conn.Close()
  			return
  		}
  		s = strings.Trim(s, "\r\n")
  		logging.Debug("<- %s", s)
  
  		if line := ParseLine(s); line != nil {
  			line.Time = time.Now()
  			conn.in <- line
  		} else {
  			logging.Warn("irc.recv(): problems parsing line:\n  %s", s)
  		}
  	}
  }
docs: // recv is started as a goroutine after a connection is established.
  // It receives "\r\n" terminated lines from the server, parses them into
  // Lines, and sends them to the input channel.