Plugin manager

Plugin manager for the new plugin structure

 - Install
  - From Rubygems
    - Latest
     - Specific version
  - From gem file

 - List installed plugins
   - All
   - Specific name
   - Specific group

 - Uninstall a plugin

 - Update
   - Single plugin to latest version
   - Single plugin to specific version
   - All to latest version
code imbrication is harder to follow, and having the error condition put at the end of the method is just harder to follow. in these situation I tend to follow this rule: keep early returns from methods at the top of the method or when the flow is obvious & linear, use it mainly for checking error pre-conditions. for example here:

```ruby
unless gem_meta = LogStash::PluginManager::Util.is_logstash_plugin(gem_path)
  $stderr.puts "Invalid logstash plugin gem '#{gem}'. aborting..."
  exit 99
end

require 'jar-dependencies'
require 'jar_install_post_install_hook'

puts "valid logstash plugin, installing..."

if LogStash::PluginManager::Util.is_installed(gem_meta.name)
  puts("removing existing plugin before installation")
  require 'rubygems/uninstaller'
  ::Gem.done_installing_hooks.clear
  ::Gem::Uninstaller.new(gem_meta.name, {}).uninstall
end

::Gem.configuration.verbose = false
specs, _ = ::Gem.install(gem, version)
puts("Successfully installed '#{specs.name}' with version '#{specs.version}'")
```