Added backup actions for files and directories.

Also changed shell actions to return stdout and stderr.
When executed, a shell action now produces a tuple, (stdouts,stderrs),
which list the standard out and standard error for each command in the
action.
Added tests for util.streams and path expansion.

These are primarily tests that the hashing function works as desired.
The performance tests are intended to guard against unnecessary
work being introduced into the hashing function itself.

Added a missing test for file expand paths to increase coverage.
Should throw an error when the target is unspecified during path
expansion. This might be a bad place to check this in the future.
Added backup action to file blocks actions

Includes addition of file[backup_dir], and relevant tweaks to the tests.
Added backup_dir to most of the dummy file blocks, added testing for
backup_dir being absent.
Fixed typo in FileBackupAction.execute
Added directory[backup_dir] and bugfix for dir copy.

This adds tweaks to the tests and the invocation of a DirBackupAction.
The bugfix ensures that we copy directory contents to the dst without
creating a new directory with the original's name inside of dst.
Updated tests to cover backup_dir expansion.

Makes very heavy-handed use of mocking.
Fixed unnecessary and misplaced test files.
Changed backup hashnames to better handle links.

Symlinks are now named using a sha256 hash of the link target.
This prevents any conflicts between a file containing a filename and a
link with that content. This is more accurate identifying
information than the content of a linked file or directory.
Added common attrs, starting with backup_dir.

These are handled slightly specially, in that they are inspected for
every block type.
Includes testing for dir backup.
Added backup logging.

Now whenever a file is backed up, the date, hash, and filename are all
recorded in a backup logfile.
Bugfix for trying to backup nonexistent targets.

The bad backup code would backup any target file or directory, even if
it did not exist. This leads to failure in a fresh deploy of SALVE. This
fix includes glue to make the tests continue to pass, but more tests
are now needed.
Merge branch 'feature/salve-backup' into dev