code: function PeerDrain(peer, options, callback) {
      var chan = peer.channel.topChannel || peer.channel;
  
      assert(options, 'options is required');
      assert(options.reason, 'a reason is required');
      assert(!chan.draining, 'cannot drain a peer while channel is draining');
      assert(!options.goal ||
             options.goal === GOAL_NOOP ||
             options.goal === GOAL_CLOSE_DRAINED ||
             options.goal === GOAL_CLOSE_PEER,
             'expected a valid goal (if any)');
  
      this.goal = options.goal || PeerDrain.GOAL_NOOP;
      this.channel = chan;
      this.peer = peer;
      this.timeout = options.timeout || 0;
      this.reason = options.reason;
      this.direction = options.direction || 'both';
      this.callback = callback || null;
      this.timer = null;
      this.drained = null;
      this.startedAt = 0;
      this.stoppedAt = 0;
      this.finishedAt = 0;
      this.thenFinish = thenFinish;
  
      var self = this;
  
      function thenFinish(err) {
          var now = self.channel.timers.now();
          self.finish(err, now);
      }
  }
docs: TODO: subsume and unify with channel draining