subscribe(cmd, nodeID) {
		if (!this.channel) return;

		const topic = this.getTopicName(cmd, nodeID);

		// Some topics are specific to this node already, in these cases we don't need an exchange.
		if (nodeID != null) {
			const needAck = [PACKET_REQUEST].indexOf(cmd) !== -1;

			return this.channel
				.assertQueue(topic, this._getQueueOptions(cmd))
				.then(() =>
					this.channel.consume(
						topic,
						this._consumeCB(cmd, needAck),
						Object.assign({ noAck: !needAck }, this.opts.consumeOptions)
					)
				);
		} else {
			// Create a queue specific to this nodeID so that this node can receive broadcasted messages.
			const queueName = `${this.prefix}.${cmd}.${this.nodeID}`;

			// Save binding arguments for easy unbinding later.
			const bindingArgs = [queueName, topic, ""];
			this.bindings.push(bindingArgs);

			return this.broker.Promise.all([
				this.channel.assertExchange(topic, "fanout", this.opts.exchangeOptions),
				this.channel.assertQueue(queueName, this._getQueueOptions(cmd))
			]).then(() =>
				this.broker.Promise.all([
					this.channel.bindQueue(...bindingArgs),
					this.channel.consume(
						queueName,
						this._consumeCB(cmd),
						Object.assign({ noAck: true }, this.opts.consumeOptions)
					)
				])
			);
		}
	}
Subscribe to a command

@param {String} cmd
@param {String} nodeID

@memberof AmqpTransporter
@description Initialize queues and exchanges for all packet types except Request.

All packets that should reach multiple nodes have a dedicated queue per node, and a single
exchange that routes each message to all queues. These packet types will not use
acknowledgements and have a set time-to-live. The time-to-live for EVENT packets can be
configured in options.
Examples: INFO (sometimes), DISCOVER, DISCONNECT, HEARTBEAT, PING, PONG, EVENT

Other Packets are headed towards a specific node or queue. These don't need exchanges and
packets of this type will not expire.
Examples: REQUEST, RESPONSE

RESPONSE: Each node has its own dedicated queue and acknowledgements will not be used.

REQUEST: Each action has its own dedicated queue. This way if an action has multiple workers,
they can all pull from the same queue. This allows a message to be retried by a different node
if one dies before responding.

Note: Queue's for REQUEST packet types are not initialized in the subscribe method because the
actions themselves are not available from within the method. Instead they are intercepted from
"prefix.INFO" packets because they are broadcast whenever a service is registered.