Initial commit for the disk simulator.

Implements a basic hard disk simulation and prints out how long the disk
lasts before it fails.
Add basic implementations of mirrored and striped disks.
Consolidate mirrored disk and striped disk logic into storage pool.
Add two more test cases.

Eventually, these test cases should be moved into a JSON config.
Use goroutines when running the test trials.
Speed up the simulation ~380x.

Internally, rand uses a mutex to synchronize its state so that multiple
goroutines may generated random numbers safely. Unfortunately, in code
where rand.Float64 (for example) is invoked very frequently, this can
lead to a slowdown when using goroutines. With this patch, each HDD
model creates its own random number generator, avoiding the need for
synchronization.

No goroutines: ~1m
Before this patch with 32 parallel goroutines: ~19m
After this patch with 32 parallel goroutines: ~3s
Minor cleanup for storage pool creation.
Add some fun stats like survival brackets and standard deviation.
Add a DEGRADED state and minor cleanup of storagePool.Step.