enhance(sidenav): support promise notifications for open, close, toggle

Closes #947.
Besides not `flush`ing properly, this callback pyramid is not very "promise-like" :smile:

The test can be refactored like this (and it passes as expected):

```js
    it('should open() to work multiple times before close()', function () {
      var el = setup('');
      var controller = el.controller('mdSidenav');

      var openDone = 0;
      var closeDone = 0;
      var onDone = function() { openDone++; };
      var onClose = function() { closeDone++; };

      controller.
        open().
        then(onDone).
        then(controller.open).
        then(onDone);

      flush();
      expect(openDone).toBe(2);
      expect(closeDone).toBe(0);
      expect(el.hasClass('md-closed')).toBe(false);

      controller.
        close().
        then(onClose);

      flush();
      expect(openDone).toBe(2);
      expect(closeDone).toBe(1);
      expect(el.hasClass('md-closed')).toBe(true);
    });
```