Non-blocking:  all of these functions seem to first get a timestamp and then add a callback to the result, calling them again with the timestamp at the end.  Maybe the get_timestamp function can encapsulate this logic?

So something like (this is not great, because of the `*args`, and `**kwargs`):  

   def timestamped(callable):
       def wrapped(*args, **kwargs):
           d = get_client_ts(self.reactor)
           d.addCallback(lambda t: callable(*args, ts=t, **kwargs)
           return d
       return wrapped

And then instead of having to add a new function to everything they could be changed to something like `d.addCallback(timstamped(old_function))` ?