[WIP] Refactor plugin system

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

Can `provide()` be eliminated by using a more Vim-typical "passive", convention-based approach? What I mean is this:

To provide `foo` and its methods, a provider is defined like so:

```
runtime/provider/foo.vim
```

When `has("foo")` is called, nvim sees that `provider/foo.vim` exists and then sources it. The method are provided simply as definitions in `foo.vim`. For example, `provider/clipboard.vim`:

```vim
" provides clipboard 'paste'
function! `clipboard#get(...)`
endfunction

"provides clipboard 'copy'
function! `clipboard#set(...)`
endfunction
```

Is there a reason the "active" approach of `provide()` is necessary instead of the "passive" approach?