docs: def start(self):
      """Start listener in a background thread
  
      Returns:
        address of the Server as a tuple of (host, port)
      """
      server_sock = self.start_listening_socket()
  
      # hostname may not be resolvable but IP address probably will be
      host = self.get_server_ip()
      port = server_sock.getsockname()[1]
      addr = (host, port)
      logging.info("listening for reservations at {0}".format(addr))
  
      def _listen(self, sock):
        CONNECTIONS = []
        CONNECTIONS.append(sock)
  
        while not self.done:
          read_socks, write_socks, err_socks = select.select(CONNECTIONS, [], [], 60)
          for sock in read_socks:
            if sock == server_sock:
              client_sock, client_addr = sock.accept()
              CONNECTIONS.append(client_sock)
              logging.debug("client connected from {0}".format(client_addr))
            else:
              try:
                msg = self.receive(sock)
                self._handle_message(sock, msg)
              except Exception as e:
                logging.debug(e)
                sock.close()
                CONNECTIONS.remove(sock)
  
        server_sock.close()
  
      t = threading.Thread(target=_listen, args=(self, server_sock))
      t.daemon = True
      t.start()
  
      return addr