ALTERNATE: Multiple version support

This is an alternate version of the multiple loading support PR (#113). I vastly prefer this implementation (reasons below) but want feedback before I pursue it further. If no one likes it, I'll delete it in favor of the other.

The relevant SHAs are SHA: 768d234 & SHA: cbccd8a (compare view at https://github.com/toastdriven/botocore/compare/f3ebbcd...cbccd8a), though it depends on part of the previous variant (the file structure changes & the integration into ``Session``).

Reasons I prefer this:
* It's explicit about what you're trying to load
* Better caching (actually handles all versions correctly)
* Less global state
* Easily swapped with an alternative implementation, like a pure Python file/JSON loaded over the network/YAML/whatever else, since it no longer cares about paths
* Much better handling of API versions, especially backward-compatible versions (based on feedback from @brendandixon)

This code works On My Machine™, but it obviously is not complete enough to merge. I'd appreciate feedback on this approach. If it looks good enough, I'll finish it & update the CLI as well, but I want to make sure I'm not going down an avenue others dislike.

Reviews please @garnaat, @jamesls, @danielgtaylor?