Add PluginPriority and PluginFunctions classes

PluginPriority defines few common values for plugin execution priority.

PluginFunctions wraps ExtensionPoint and use defaultdict() to handle priorities.
It also provide a register() and a run() methods.
Use PluginFunctions and PluginPriority to reduce code redundancy.

weight was renamed priority
Execution loops were replaced by PluginFunctions.run() call
Use PluginPriority.HIGH and rename weight to priority
Try to run on previous Picard versions at normal priority.

Since there is no PluginPriority on previous Picard versions, this plugin will
raise an exception, better catch it and emit a warning.

Sophist said:
"It will work in most cases at normal priority, but any other plugins that run before it will get the old performers rather than the standardized performers.
Merge pull request #4 from zas/PluginPriority

Improvements to plugin priority handling by @zas.