[WIP] Refactor plugin system

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

This neatly avoids "polluting" the namespace by keeping everything in `provider#`. And we don't need to add any extra handling for a new `provider/` convention (we're instead using the existing `autoload/` convention). :+1: 

I also verified that users/plugins can add new providers by adding `<plugin name>` to `'runtimepath'` and then calling `:runtime! autoload/provider/foo.vim`.