Rework enip.device Object and Attribute handling
o Make the enip.device.directory better sortable
o Add symbole resolve capability for Tags
o Begin implementing extension of parser in derived Objects
o Handle Read Tag [Fragmented] parse and request processing, including
  status extended error data
o Rework enip_cli test client to parse EtherNet/IP payload while
  streaming reply data, to dynamically detect end of request.
Progress toward more EtherNet/IP Object functionality
o Added port/link EPATH segment parsing/producing
o Rename logix.Logix_Data Object to logix.Logix
o
More progress toward CIP Object Service processing
o Fixed the dotdict.pop to properly handle default; not a keyword
o Reorganize delegation of Services to derived Objects
o Allow either data.read_frag or data.service == 0x__, instead of demanding
  both, to better allow for hand-crafted requests.
o Implement more of the CIP Object produce methods
Begin conversion from array.array to bytearray for storing bytes data.
o For Python2/3 compatibility, array.array( 'B'/'c', ...) is not useful.
  The conversion between bytes and array.array is tiring and different
  between the two platforms, while bytearray converts between bytes
  easily.
Initial working implementation of EtherNet/IP Logix Controller simulation
o Add ability to specify Tag redirects to class/instance/attribute IDs
o Added Attribute[#]=value with range checking, for writing values
o Set up basic CIP Object model, with UCMM, Connection Manger, etc.
o Enabled python -m cpppo.server.enip with default Logix Controller
Merge branch 'feature-enip-device'