Logical Device Support

cc/ @bencevans 

Changes:
- Changed [Listener](https://github.com/stephen/node-sonos/blob/logical-devices/lib/events/listener.js#L10) class to think in terms of "handlers" instead of "endpoints." This makes more sense because you might have multiple handlers for a given endpoints' events, so "client" code should think about handlers logically. I don't believe any previous code used these, but it could technically be considered a breaking change (API changed `addService`/`removeService` to be prefixed with `_`.
- Added `LogicalDevice` class. Takes in an array of Sonos devices that can be managed together (i.e. forms a group or stereo pair). This class currently supports group change for volume. The API between a `LogicalDevice` and regular `Sonos` device should be identical. (Commands that are only addressed to the coordinator (e.g. play/pause) are simply passed down to the underlying `Sonos` prototype.
- Added a `volumeListener` class to keep internal state on a `Sonos` object. Used by `LogicalDevice` to do volume changes (but not on other methods).

Missing:
- Lacks a search function. Will be addressed in separate 1.0.0 PR.
- Lacks group impl for `getLEDState`/`setLEDState`. Should be trivial (and also low pri..)
- Does not change the underlying `Sonos` implementation to use the newly cached volume state (should be address by separate PR)
Good point. I was thinking the client would be like a Sequelize 
instance. (are you familiar?)

On Mon, 8 Dec, 2014 at 5:36 AM, Stephen Wan <notifications@github.com> 
wrote:
> In examples/volumeWatcher.js:
> 
> > @@ -0,0 +1,8 @@
> > +var Sonos = require('../index').Sonos;
> > +
> > +var device = new Sonos(process.env.SONOS_HOST || '192.168.2.11');
> > +device.startListeners(function() {
> (oops - this should be initialize() instead of startListeners())
> 
> We previously discussed doing initialization for listeners 
> automatically with search (meaning manually spun up Sonos instances 
> would have to initialize()) on their own. Are you thinking we should 
> do automatic initialization for any Sonos instance? (also, how? since 
> a callback is needed - not sure if it's good practice to do that from 
> a constructor.)
> 
> —
> Reply to this email directly or view it on GitHub.
> 
=