subscribe (type, ident, filter) {
    let s = this.getFreeDataSocket()
    if (!s) {
      s = this.openSocket()
    }

    const doSub = () => {
      s.ws.managedSubscribe(type, ident, filter)
    }

    if (!s.ws.isOpen()) {
      s.ws.once('open', doSub)
    } else {
      doSub()
    }

    s.pendingSubscriptions.push([type, filter])
  }
Subscribes a free data socket if available to the specified channel, or
opens a new socket & subs if needed.

@param {string} type - i.e. 'book'
@param {string} ident - i.e. 'tBTCUSD'
@param {object} filter - i.e. { symbol: 'tBTCUSD', prec: 'R0' }