Add event priority

Sparked by #2163, the order in which event callbacks are invoked is completely depending on the order in which they are added. This patch would allow events to be given a priority where the higher priority callbacks are invoked first.

```js
model.on('change:name', function () {}); // normal, doesn't care about order
model.on('change:name!-1', function () {}); // before 'change:name'
model.on('change:name!1', function () {}); // after 'change:name'
model.on('change:name!-2', function () {}); // even before the 'change:name!-1'
```

Let's chat. Is this valuable or not worth the overhead?