Argument type validation with user-friendly error messages

Prefer pytest's parametrization functionality to `for` loops:

```python
@pytest.mark.parametrize('arg_type',
[
    dict, list, tuple, bool
])
def test_validated_non_nullable_types(self, arg_type):
    arg = Arg(type_=arg_type)
    # ...
```