Argument type validation with user-friendly error messages

If we want this mapping to be configurable, it should not be named like a constant, i.e. uppercased. Perhaps lowercase `type_map`, or `__type_map__` (to be consistent with `Parser.__target_map__`.

Same thing with `NON_NULLABLE_TYPES`.