Add reserve, remove option to specify backing types.

- Storage type now uses std::aligned_storage.
- Now backed by a vector and unordered_set.
- Replaced explicit calls to lock/unlock with lock_guard to simplfiy
  cases where an exception is thrown.
- collect, at, and operator[] now check to make sure the index provided
  is allocated. If it's out of range for the vector, std::vector.at()
  will catch that as well.
- For pools that use a mutex, the mutex is now std::recursive_mutex,
  just in case someone tries to do something strange inside an each_*
  function.
- Comment headers added for each function.