Fixed bug in error handling in Controller.run().

Expected errval.args to have at least one argument, which is not true
for KeyboardInterrupt().
Fixed logging messages in Cycle.archive_from method.
Fixed bug: memory log handler was not properly added and configured.
Fixed bug: subprocess' stdio streams were binary. Now are in text mode.
Simplified alt_func logic in class if_not_dry_run.
Cycle.purge() now checks that maxnumber of complete snapshots are kept.
Created a new Handler class for the 'memory' logging handler.

ManualFlushMemoryHandler is a subclass of MemoryHandler which is used
instead of a StreamHandler with a io.StringIO stream.
Added the configdir option.
Fixed bug: Cycle raises an exception if rsync exits with a >0 value.
Added systemd service and timer units.
Fixed typo in --exclude-from option in rsyncWrapper.
Fixed debug message in rsyncWrapper._prepare_logfile method.
Fixed bug: Empty the buffer before closing ManualFlushMemoryHandler.
Added the --rsh option for the rsync subprocess.

The --rsh option allows the calling process to specify argument to pass
to ssh. The "--rsh=ssh -o BatchMode=yes" argument prevents the ssh
subprocess from prompting for a password. I assume an ssh agent is used.
Clarified error message in Snapshot.mkdir method.
Bug fix: I had the Snapshot ordering in reverse.

Changed the wip suffix from "0" to "wip" so that the work in progress
snapshot appears first in reverse-ordered directory listing.

The most recent snapshot must have index 0. I inverted all the tests.
Removed no longer relevant #TODO comment.
Replaced "wip" magic number with Snapshot.wip_suffix class attribute.