[RFC] msgpack: Recognize buffers, windows, tabpages, and notifications.

One day it dawned on me that we could start an embedded nvim instance with `rpcstart()`
```vim
let vim = rpcstart('nvim', ['--embed'])
```
and send commands from within the parent nvim instance!
```vim
call rpcrequest(vim, 'vim_set_current_line', 'SOME TEXT')
echo rpcrequest(vim, 'vim_get_current_line')  " Prints SOME TEXT
```
but that attempting to get a list of windows, buffers, or tabpages would hit an `abort()` from `object_to_vim()`.
```vim
echo rpcrequest(vim, 'vim_get_buffers')
echo rpcrequest(vim, 'vim_get_tabpages')
echo rpcrequest(vim, 'vim_get_windows')
```
This PR makes the above lines not trigger that abort. Inspired by [vim-misc's xolox#misc#os#exec()](https://github.com/xolox/vim-misc/blob/master/autoload/xolox/misc/os.vim#L82), which spawns another vim instance in order to execute commands asyncronously.
Question is do we know it's a notification because the message type equals 2, or because the array size is 3? I've refactored it (again) to try and make the ambiguity more clear and use those helper functions instead of pointer math.