Split header out into many

Each STL container added pulls in another standard library header.  This
is a waste of time when building if someone has otherwise been careful
to only pull in only what is needed.  Split the definitions out by
supported container to alleviate this issue.
Rename namespace: `detail' => `impl'