[WIP] Refactor plugin system

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

> I don't see this, because the method can be looked up using Vim's already-existing method lookup. For example, if clipboard get is requested, find_func finds it. Then the args are simply passed to the variadic function provider#clipboard#get(...). Note that ... allows the args to be unpacked in vimscript using a:1, a:2, etc.

Other than the clipboard provider, I can't see any other provider that will have it's methods implemented in vimscript. Most of the times, providers will be dispatched via msgpack-rpc because it is usually easier to interact with external systems using a real programming language(unless a shell command is readily available, in that case vimscript is simpler).

For example, here's how the current python provider looks like:

```vim
function! provider#python#Call(method, args)
  return call(s:rpcrequest, insert(insert(a:args, 'python_'.a:method), s:host))
endfunction
```

The call is simply dispatched to the python host. Here's how it would look like using a one function per provider method approach:

```vim
function! provider#python#Execute(args)
  call call(s:rpcrequest, insert(insert(a:args, 'python_execute'), s:host))
endfunction
function! provider#python#ExecuteFile(args)
  call call(s:rpcrequest, insert(insert(a:args, 'python_execute_file'), s:host))
endfunction
function! provider#python#DoRange(args)
  call call(s:rpcrequest, insert(insert(a:args, 'python_do_range'), s:host))
endfunction
function! provider#python#Eval(args)
  return call(s:rpcrequest, insert(insert(a:args, 'python_eval'), s:host))
endfunction
```

That will also apply to all other language hosts we may implement