api_views.py:
- for Sample POST and PATCH return JSON message for Bad Request 400 in cases where the specified panel does not match the site ( or any ValidationError thrown)

models.py:
- Sample.clean(): throw ValidationError of either the specified site or visit project does not match the sample's subject project

 serializers.py:
 - don't restrict SampleSerializer field 'visit' to be read_only

 utils.py:
 - apply_panel_to_sample(): throw ValidationError if the specified panel's site doesn't match the sample's site