Fully restructure project

This huge commit applies a major refactor to this library that has the following
goals:

- Simplify code
- Reduce coupling between components
- Remove most python-specific metaprogramming practices in favor of a more
  classic/simpler object-oriented approach that should mirror to constructs
  found in other languages more easily
- Improve readability
- Use flake8 as a linting program
- Implement the event loop layer using asyncio/trollius, which should be more
  compatible across python implementations

The motivation behind those goals is to transform this project into a
well-documented reference implementation of a Nvim client that can easily be
ported to other languages.

The library is now organized into two big components:

- A nvim-agnostic msgpack-rpc implementation that eventually can be exported to
  a separate python package. It uses a middleware-based architecture where each
  layer has a distinct responsibility:
  - The event loop, which is responsible for OS-level communication(connections,
    spawning processes, etc)
  - The bytestream layer, which reads/writes data by delegating to the event loop
  - The msgpack-stream layer which serializes/deserializes python objects and
    forwards to the bytestream
  - The async-session layer, which implements msgpack-rpc logic in an
    asynchronous way
  - The session layer, which uses coroutines to expose a synchronous msgpack-rpc
    interface
- The API layer, which wraps a msgpack-rpc session and exposes an API that
  resembles the one provided by python-vim bridge