Use pydantic constraint types to provide easier definitions

Currently quite a few of the validators for the pydantic models are not yet using constrained types.

This needs to change to have more strict validation and fewer and less complicated validator functions.