Use Ruby Enums for STATE & ACTION to ensure callbacks adhere to the spec

- New Enum class provides Enum like functionality to Ruby, although it’s far more flexible as integer indexes, symbols, strings and Enum classes are interchangeable
- Introduced a Protocol Message Bus to separate out public API state changes from message routing  between classes
- Added test coverage to the Callbacks & Protocol Message Bus classes / modules
- Unsupported Protocol Message types will be ignored but will not cause outright failures, thus ensuring future proof support for the library.  Warnings will be logged.
-
Use generic Logger for warnings, errors and debug messages
Use a MessageDispatcher class to handle all incoming ProtocolMessages