Initial pass at device abstraction

This should go before #118 
Protobuf handles changes to the model rather well. This is why most of the fields are marked as optional in the proposed definition. From the [protobuf docs](https://developers.google.com/protocol-buffers/docs/overview)

>You can add new fields to your message formats without breaking backwards-compatibility; old binaries simply ignore the new field when parsing. So if you have a communications protocol that uses protocol buffers as its data format, you can extend your protocol without having to worry about breaking existing code.