[WIP] Refactor plugin system

This supersedes #1335, using funcrefs instead of autocommands to implement providers(it is cleaner and requires less changes).

> Is there a reason the "active" approach of provide() is necessary instead of the "passive" approach?

:+1: I'm gonna give it a shot