Change plugin loading logic to allow plugin overriding

Now, the plugin logic works like this:
1. Scan all specified plugin paths for any plugins
2. Group plugins by their name, and sort by descending version number
3. For each plugin name, go down the list of plugins until one is
   successfully loaded

Also handles things like plugins that are incompatible with current
core version (it won't load these), and plugins without versions (it
will give these lowest precedent, but will load them.)