Refactored image validation into a custom field

This fixes issues with Django closing the image file before running
validators.
This may give a slight improvement in upload speed as the file doesn't
keep having to be reopened.
This unifies our image validation with Django's image validation so
error messages could be shared (not implemented yet though).
The code is more maintainable (the validators no longer need to be
called manually from the multiple image uploader for example)