new command motomove directly positions the erc manipulator over the serial connection
- Added documentation for a few un- or under- documented ERC commands (see the MRC communications docs)
- Plugged-in support for the erc lib's new RSTATS decoding function
overhauled to use dict-dispatch, minor refactoring

- switched from conditionals to dict-dispatch to handle modes. the
static analysis is very happy.
- refactored the jobname to rootname in line with an etc overhaul
major overhaul

- Ripped out the read_multipacket_message function and replaced it with
the read_message function. This eliminates redundant code an provides a
more consistent way to read multi-block messages.
- refactored and clarified names. this is mostly reflected in the
change Packet -> Message, in the new language a message is sent between
machines, it can consist of multiple blocks.
- handlers now accept the a message named tuple instead of separate
header and message body arguments
- removed the transmit_file_data function and incorporated that
functionality elsewhere
- added an option to specify a header to the get_file function, this is
useful in speculative get_file requests
- eliminated a bug where error results to the execute_command function
were reported twice (and in unattractive ways)
- removed the “once” option to the loop function
- dropped packet_length from the Message named tuple
- added a ControlChar named tuple to encapsulate a control character.
this is mostly unimplemented
- Added a proper constructor for InvalidTransaction exception. It makes
instantiating the Exception cleaner. Formatting is more consistent.
- Changed many instances of “blah {} blah”.format(somevar.__repr__())
to “blah {!r} blah”.format(samovar). This is cleaner, shorter syntax.
- Changed some instances of calls to .format into string concatenations
- Added the decode_rstats function to make it easier to process results
of the RSTATS call both programmatically and when reading them manually
- Changed the nomenclature in the encode function: transaction_code ->
header_code
- Took yet another crack at eliminating the ongoing off-by-one error in
the encode function
- changed the name of the filename_to_jobname function to
filename_to_rootname, this better reflects that non-job files are also
processed by this function
- Added the namefix function from the motodisk command. this changes
the internal job name in a job file so that it matches the on-disk
filename.
- Added a function to do reverse-lookups on the TRANSACTIONS dict. This
returns a filename extension associated with the given transaction code
- improved some function inline documentation