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

Could the keys just be the type objects rather than the string names of the types? This would allow a user to included multiple classes with the same name in the mapping

```python
from module_a import MyType as MyTypeA
from module_b import MyType as MyTypeB
JSON_TYPE = {
    MyTypeA: 'object',
    MyTypeB: 'object',
}
```