Move iterable checks from type_cast_value to __init__
Both the errors raised in type_cast_value should be in __init__ instead. The composite error should be removed from type_cast_value, it makes no sense at runtime. Both places that value is iterated in type_cast_value should raise a BadParameter error instead of TypeError.
Originally posted by @davidism in #1805 (comment)