Initial implmenetation of enip.Device Objects and Attributes
Make enip.SSTRING produce from a dotdict or a Python str
Begin to refactor enip server to use enip.device objects
o Renamed enip.Device to enip.device
Completed initial implementation of Logix PLC round-trip
o EtherNet/IP Register works
o Changed cpppo.dfa locking to blocking, so that the same parser may be
  used by different threads, and properly serializes.  This is NOT safe,
  if a pair of cpppo.dfa instances appears in multiple different
  machines, in different order (deadlock).  This is preventable by
  convention: do not include the same cpppo.dfa instance in multiple
  machines.
o Removed unnecessary heirarchy (eg enip.header., enip.encapsulated.)
o Added enip.device.Message_Router Object which manages EtherNet/IP
o Revered enip.main.enip_srv's enip_process target function to
  consume data.request and produce data.response, and return True
  on session continuation.
o Removed duplicate parsing of EtherNet/IP header from enip.CIP
o Renamed enip.parser.logix to Tag, to not interfere with enip.logix
  module.
o Added SO_REUSEPORT to allow quick restarting of services.
Merge branch 'feature-device-objects'