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