Track unique lights in a map

Instead of lights being a "blind" collection of lights, it's now a map. The key in the map is the DeviceID and therefore if we want to find/target a single light that becomes much easier now.

This PR also changes client to send not *one but two* `LightGet` messages out. I had some instances on my own network where sending only one message would mean *sometimes* only one light would respond. I have not seen so far an event where sending these two messages means that one light does not respond. I do not know how this works, but it does so I've left it. 

This also separates the light+light collection stuff into two separate files because files are cheap.
My only thoughts code-wise is about this section.

I don't think it makes sense for the discovery thing to have to know anything about decoding device IDs from messages. I also don't think this conditional is necessary here. Conditionals =~ complexity, and `UpdateFromState` would essentially be idempotent. 

I'd rather either keeping it simply as `ch <- c.Lights.Register(payload)` (which updates from state) or at least have `Register` have two return values, one of which denoting whether it was actually registered. 

Maybe there's just a better name for `Register()` to convey that it's really "after calling this, the light will become or will continue to be registered." Either way, for sure, `Register()` should be where the knowledge of light IDs, how to extract them, and that they are used as the unique ID should all live.