feat(selectDirective): add $optionChangeListeners to selectDirective controller

Adds `$optionChangeListeners` to the selectDirective controller, this is fully backward compatible and has no impact on performance whatsoever if the dev decides not to use it, and has no impact on existing code.

The reasoning behind this feature is that `ng-options` expression is un$parseable from outside the `optionDirective`, and you can't have the current set resulting from the `ng-options` expressions without relying on a scope. This forces the dev to create a custom directive to watch for changes on a `filtered` variable from the underlaying scope (like `ng-options="item.text for item in (filtered = (items | filter:fn1 | filter:fn2))" and it's not portable between directives, like `$viewChangeListeners` in `NgModelController`.
This makes isolated select controllers easier to accomplish and scope agnostic, aka web components style. 

This also encourages future proof directive code, since it won't depend on the DOM or manually crafted  enforced scopes, nor needs to watch over collections (that increases $digest overhead). 

Pseudo-code:

```js
.directive('selectPlugin', function(){
  return {
     restrict: 'A',
     require: 'select',
     link: function(scope, el, attrs, select){
       select.$optionChangeListeners.push(function selectListener(items){
          if (el.selectPlugin.initialized) {
            el.selectPlugin.refresh();
          } else {
            el.selectPlugin.init();
          }
       });
     }
  };
});
``` 

```html
<select select-plugin ng-options="item.id as item.name for item in items | filter:filterFn"></select>
```

Closes #9222
Why? This needs to be consistent, if the listeners are called when using ng-option then they also need to be called when the last `<option>` inside the `<select>` is added