def timeout(seconds, *args)
      cancel_timeout
      me = self
      @deferred_timeout = ZMachine::Timer.new(seconds) { me.fail(*args) }
      self
    end
def timeout(seconds, *args)
      cancel_timeout
      me = self
      @deferred_timeout = ZMachine::Timer.new(seconds) { me.fail(*args) }
      self
    end
Setting a timeout on a Deferrable causes it to go into the failed state after
 the Timeout expires (passing no arguments to the object's errbacks).
 Setting the status at any time prior to a call to the expiration of the timeout
 will cause the timer to be cancelled.