I'm not sure it is really worth composing with AdbClient.
I think what we want here and in AdbDeviceTracker, and may be also in AdbFileTransfer is to delegate to it.
For example, the final usage of `AdbCommandRunnger.devices` is a bit complex.
You have to manually call close on returned promise resolution/rejection,
whereas we can't call `devices` multiple times in a raw and reuse the same connection.
You will always have to close the new socket after each call to `devices`.
It would be better to automatically close the socket in `devices` method.
Then there is no point in having multiple instances of AdbCommandRunner.
That brings me to my second though: I'm not sure we need to use classes either.
`AdbClient` also looks more like a singleton.
Except for `this._sockets`, nothing is being binded to AdbClient instances.
`_sockets` could be a global of `adb-client.js` module and all other methods being methods exported by the module.
```
let sockets = [];
exports.connect = function () {
  let socket = TCPSocket.open(...);
  sockets.push(socket);
  ...
  return socket;
}
exports.sockSend = function (...) {...}
```
-and/or-
We can have a real usage of classes and create instances around adb tcp sockets.
And bind the tcp socket to the class instances:
```
let AdbSocket = Class({
  initialize: function () {
    this.socket = TCPSocket.open(...);
    sockets.push(socket);
    ...
  },
  sockSend: function (...) {...}
```