Sync pool operations and eliminate race conditions

This patch re-implements Pool storage using `YAML::Store` from the Ruby stdlib.
`YAML::Store` provides a hash with autoflushing file-backed storage. Concurrent
operations between multiple processes are protected by `File.flock` (to the
extent that `flock` works on a given filesystem).

Previously, persistance was handled by de-serializing a `Pool` or `PoolManager`
object from storage at the beginning of a Vagrant run and then re-searializing
it when the run completes. This method enabled some notable race conditions:

  - If the Vagrant process did not exit cleanly, an updated pool file would
    never be written. However, the vagrant process may started VMs that are now
    using IP addresses from the pool.

  - Starting multiple Vagrant processes would result in divergent states that
    could not be reconciled.
Use Markdown in YARD docs
Fix pool file creation

Pool files are no longer created with the default "/24" range. Instead, this is
done dynamically the first time a request is made to the pool manager.

Started a new `PoolStorage` class which inherits from `YAML::Store` and adds
logic for intializing and upgrading the pool file data structure.
Re-implement upgrades of existing pool files

By overriding `YAML::Store#load` in `PoolStorage`, we can intercept data as it
is loaded and perform on-the-fly upgrades of the serialized data structure.
Add proper YARD documentation to PoolManager
Ensure PoolManager#generate_pool_for is idempotent
Merge pull request #12 from Sharpie/synced-ops

Implement persistence and synchronization for pool.yaml

Fixes #6.