Adding a Volume interface and UnixVolume implementation.

refs #2620
Bug fix: GetBlock must report a CorruptError immediately.

Refs #2620.
Made KeepVolumes a slice of Volume objects, not strings.

Moved more Unix-specific code into volume.go as part of the process.
Added UnixVolume unit tests. (refs #2620)
Moved the MD5 verification check back to GetBlock.

Policy tests such as checksumming belong in the Keep front end. The back
end should be limited to moving data in and out of a volume. (refs #2620)
Updated UnixVolume unit tests (refs #2620).
Added -serialize flag.

Added IORequest and IOResponse types for communicating I/O
requests over channels with a goroutine.

New IOHandler method on UnixVolume. IOHandler receives requests on a
command channel, handles them, and delivers responses. Whenever a
UnixVolume is created with a non-nil queue, an IOHandler must be started
to handle its requests.

UnixVolume methods Get and Put now handle external I/O requests.  These
methods serialize I/O requests if serialization is enabled for that
volume; otherwise they call Read and Write directly.

New unit tests: TestGetSerialized and TestPutSerialized.

Refs #2620.
Cleaned up unit tests. (refs #2620)

Added a MockVolume implementation to use in unit tests for the
Keep front-end handlers.

Simplified IsValidLocator and keep_test.go:setup code.
Cleaned up unit tests. (refs #2620)

Added a MockVolume implementation to use in unit tests for the
Keep front-end handlers.

Simplified IsValidLocator and keep_test.go:setup code.
Make sure an IOHandler is running when -serialize is on.

Use MakeUnixVolume to create new UnixVolumes, to ensure that an
IOHandler is started whenever necessary. (refs #2620)
Reorganized Volume code for easier comprehension.

Refs #2620
Corrected name for volume_test.go.
Merge branch 'master' into 2620-keep-serialize-io
Incorporating code review comments (refs #2620)

* use filepath.Join to build file paths instead of fmt.Sprintf
* use ioutil.ReadAll to ensure that we read the whole file
Replaced KeepVolumes with a VolumeManager interface.

A VolumeManager interface may be used to set policy for writing to a set
of Keep volumes. The sole implementation at present is RRVolumeManager,
which implements simple round-robin scheduling; other implementations
could include a manager which selects the least-loaded disk first, the
fastest one, the one with the fewest pending writes, etc. etc.

Refs #2620
Merge branch '2620-keep-serialize-io' (closes #2620)