I tried to think of possible cases and not sure why we use ```setInterval``` here. Maybe I missing something?

IMO something similar to the code below will cover the same cases, but will make code cleaner (at least we can get rid of ```pauseMonitor```, ```resumeMonitor```, ```this.dirty``` and probably ```visibilityChange``` handler):
```
startMonitor: function() {
  Compose.on('input', this._onDraftChange);
  ThreadUI.recipients.on('add', this._onDraftChange);
  ThreadUI.recipients.on('remove', this._onDraftChange);
},

_onDraftChange: function() {
  // If we've already scheduled saving of draft, let's cancel it and
  // re-schedule once again. Eg. it can be the case when user types text or just makes
  // message updates quickly.
  if (this._timeoutId) {
    clearTimeout(this._timeoutId);
  }

  // To avoid binding all the time, it would be better to move this anonymous
  // function to method and pre-bind only once on init.
  this._timeoutId = setTimeout(function() {
    ThreadUI.assimilateRecipients();

    this.storeDraft({
      recipients: ThreadUI.recipients.list,
      subject: Compose.getSubject(),
      content: Compose.getContent(),
      timestamp: Date.now(),
      threadId: this.DRAFT_MESSAGE_KEY,
      type: Compose.type
    });
    }.bind(this), SMSDraft.DRAFT_SAVE_TIMEOUT);
  },
```