Add support for client-side RPC

A major refactor was necessary in order to support client-side RPC:

- Every API function now has a non-blocking variant(prefixed with `send_`).
  These send_* functions return promises that have a single `wait` method to
  wait for the result.
- The synchronous versions are still provided, but are implemented by calling
  the async version followed by a `wait` call.
- `vim.next_event` is now `vim.next_message`, and messages are specialized
  objects that represent events or requests. It always has at least three
  properties: `name`, `args` and `type` where:
  - `name` is the method/event name
  - `args` is the method/event arguments
  - `type` is either `event` or `request`
  Additionally, requests have a `reply` method that can be used respond to the
  request. The `reply` method accepts a single argument that will be returned
  to the remote nvim instance.
- `vim.push_event` is now `vim.push_message` and receives two arguments: `name`
  and `args`.
- Multi-thread synchronization was refactored/improved

On top of that, the `expect` method was removed since that can be easily
implemented as a higher-level feature of a test library.