[WIP] Argument type validation with user-friendly error messages

In order to ensure support for binary and unicode strings on both Py2 and Py3, you could do the following:

```python
# at the top of the file
if not PY2:
    # ...
    text_type = str
    binary_type = bytes
else:
    # ...
    text_type = unicode
    binary_type = str
```
```python
JSON_TYPES = {
    text_type: 'string',
    binary_type: 'string',
    # ...
}
```