create plugin infrastructure

Todo:
- unload in such a way that we can load a different copy of the same named plugin later and have dlopen() get the new file
  - probably impossible, internet says there are weird things going on with boost and libraries that link against the library you loaded pinning it in memory or something
  - workaround is to rename the .so you compile and load that (with the filename: arg), this works for loading a new version of a plugin.
  - maybe it's a good idea to make the plugin's version part of the plugin's filename
- tests?
- make a mongos-compatible plugin to test that it works (current one uses nsdetails which mongos doesn't have)

Done:
- load plugin
- create and install command object
- install/package built plugins
- decent usability
- unload plugin
- do something intelligent on shutdown
- mongos
- test that loading a plugin that can't work produces a reasonable error (trying to load a plugin that uses nsdetails into mongos doesn't work because it can't find the symbol, and the error looks good)
- factor out some of the plugin scaffolding: CommandRemover, load and unload could be simpler, make a "plugin creating library" (see CommandLoader)
- Maybe add something to PluginInterface that says which servers (mongos/mongod) (and versions?) a plugin is compatible with, and reject being loaded into incompatible ones. Actually this can probably be done by doing something tricky in the load() method that looks at the version info in the binary the plugin is getting loaded into.  TODO: test this
- test loading a plugin into a mongod that didn't have it packaged originally
- fix this crash:
    ```
    mongod: src/third_party/boost/boost/smart_ptr/shared_ptr.hpp:424: T* boost::shared_ptr<T>::operator->() const [with T = mongo::plugins::PluginHandle]: Assertion `px != 0' failed.
    Thu Jul 18 18:44:06 Got signal: 6 (Aborted).
    
    Thu Jul 18 18:44:06 Backtrace:
    0xb89f37 0x80d673 0x7ffd8a5e8240 0x7ffd8a5e81c9 0x7ffd8a5e95c8 0x7ffd8a5e1356 0x7ffd8a5e1402 0xaafde1 0xaaf9ad 0x95c817 0x95cc7b 0x95ca44 0x80da02 0x81eaa3 0xbc3a8c 0x7ffd8b7a1dd2 0x7ffd8a698cdd
     ./mongod(_ZN5mongo15printStackTraceERSo+0x27) [0xb89f37]
     ./mongod(_ZN5mongo10abruptQuitEi+0x119) [0x80d673]
     /usr/lib/libc.so.6(+0x35240) [0x7ffd8a5e8240]
     /usr/lib/libc.so.6(gsignal+0x39) [0x7ffd8a5e81c9]
     /usr/lib/libc.so.6(abort+0x148) [0x7ffd8a5e95c8]
     /usr/lib/libc.so.6(+0x2e356) [0x7ffd8a5e1356]
     /usr/lib/libc.so.6(+0x2e402) [0x7ffd8a5e1402]
     ./mongod(_ZNK5boost10shared_ptrIN5mongo7plugins12PluginHandleEEptEv+0x37) [0xaafde1]
     ./mongod(_ZN5mongo7plugins6Loader8shutdownEv+0x5b) [0xaaf9ad]
     ./mongod() [0x95c817]
     ./mongod(_ZN5mongo6dbexitENS_8ExitCodeEPKc+0x206) [0x95cc7b]
     ./mongod(_ZN5mongo11exitCleanlyENS_8ExitCodeE+0x9a) [0x95ca44]
     ./mongod(_ZN5mongo15interruptThreadEv+0x114) [0x80da02]
     ./mongod(_ZN5boost6detail11thread_dataIPFvvEE3runEv+0x19) [0x81eaa3]
     ./mongod() [0xbc3a8c]
     /usr/lib/libpthread.so.0(+0x7dd2) [0x7ffd8b7a1dd2]
     /usr/lib/libc.so.6(clone+0x6d) [0x7ffd8a698cdd]
    ```