[#27906689] Improve cherrypicking performance

This makes several changes to the cherrypicking code in order to
improve the performance of the step.  Essentially, where possible,
everything is pre-cached meaning that inserts/updates do not mix with
queries.

The code should also be slightly easier to read now too.
[fixes #27978741] Disabled acts_as_audited for update

Assets now only audit destruction, which makes more sense and offers
performance improvements.
[#27906689] Some changes to improve performance

Don't need to validate the uniqueness of content_id in
container_associations as that's enforced by the index on the table.

Fixed a problem with the cherrypick plate generation where the array
needed to be duplicated, before being cleared.

Use study_id & project_id when dealing with the aliquot cloning to
prevent a query of the DB.
[#27906689] Minor view change to not expand past the page width
[#27906689] Enable burst mode for AMQP sending

Reload the updated records that are passed enmasse, with eager loading,
so that the JSON generation is slightly improved.
[#26906689] Remove unnecessary validations

No need to validate these as they are enforced by the DB.
[#27906689] Utilitise DB for ordering & bug fix

Only push a partial plate if all of the source beds have been used and
we have not already push the target plate.

Use the DB to order the requests so improve the performance slightly.
[#27906689] Avoid interleaving query & updates

This is an attempt to reduce the interleaving between SELECT &
INSERT/UPDATE so that the query cache is invalidated as little as
possible, and to improve the performance of the wells being set on the
target plates.
[#27906689] Attach, not import, wells
[#27906689] Fix up well detail saving
[#27906689] Removed validation on container associations.
[#27906689] Heavy refactoring of cherrypicking code

Brought more of the cherrypicking code inline with performance
optimisations.
[#28066497] Request loading performance enhancements

Only load the requests that the user has selected, rather than loading
all of the input requests for a pipeline and then grouping them to
determine if the right ones have been selected.  This should
considerably improve the performance of batch creation.
[#28281691] Improved pipeline inbox loading

Eager load the right things for the display of inboxes.

Load only what is necessary based on how the pipeline groups things,
rather than loading every possible combination regardless.
[#28066497] Use constraints for batch_request rather than validations
[#27906689] General improvements in record creation

Removed a load of validations that are already being handled by the
constraints in the database.

Create UUID directly and assign to the record, rather than creating
through the record, which causes a SELECT query to be performed.

Wrap certain operations within a transaction to improve the performance
of AMQP broadcast, as well as protect the data.
[#27981523] Fix partial plate handling

This ensures that the partial plate is reset once it has been filled,
which means that subsequent plates are then considered to be blank, even
of control wells.
[fixes #28740279] Correct full robot bed bug
[fixes #28813885] Max beds affects target plate

The number of beds a robot has affects a single target plate, not the
entire batch.  Each target plate is done as a separate run on the
robots.
Merge pull request #477 from mattdenner/27906689_cherrypicking_approving_plate_layout_has_become_slower_after_amqp

27906689 cherrypicking approving plate layout has become slower after amqp