async listen() {
    while (this.state !== stateEnum.EVICTED) {
      let topic;
      let data;

      try {
        [topic, data] = await this.socket.receive();
      } catch (e) {
        if (this.state !== stateEnum.EVICTED) {
          await this.evictNode({
            broadcast: true,
            reason: e.message,
          });
        }

        return;
      }

      // do nothing is the node was evicted even if we already check
      // for this in processData()
      if (this.state === stateEnum.EVICTED) {
        return;
      }

      if (this.state !== stateEnum.BUFFERING) {
        await this.processData(topic.toString(), data);
      } else {
        this.buffer.push([topic.toString(), data]);
      }
    }
  }
Starts subscribing to other nodes
Do NOT wait this method: it's an infinite loop, it's not meant to ever
return (unless the remote node has been evicted)