Move GraphSteps to HashMultiset
Move GraphStep to HashMultimap
Activate REAP logic on all tables (Fix #11000)

Since REAP was not being properly passed down the
tree of GraphSteps, this commit considers any row
that is to be re-checked (i.e. is present in the
reapTableIds map) to be SOFT. In other words, a
failure for a row that will be processed again
later on does not constitute a hard failure.

Note: this is not necessarily strictly valid in
all cases. A row is in 2 separate subtrees, then
really it should be checked if the entire subtree
is to be re-checked. That logic may have to wait
for a revamp of the ome.services.graph package.

Tested via CMU-1 and openmicroscopy/bioformats#536
Disable the CHGRP-VALIDATION event logs

They don't represent an actual change to the data
and therefore serve little or not purpose.
Passing test in chgrp.py (See #11000)
Fix wrong return ID from findImproperIncomingLinks
Fix GraphStateUnitTest

Due to changes in spec.xml (especially the introduction of more metadata
graphs), the unit tests were failing. It now passes. A few of the changes
like the getTotalFoundCount() results were a bit surprising. Here, asserts
have been changed to match the results, though not optimal, since we know
that chgrp/delete are working.
Refactor REAP to GraphSteps

Rather than individually setting REAP on rows (without properly
handling the subpaths), now all rows are cached in GraphSteps
so that we know if any row has already been successfully handled.
Merge branch '11000-companion-constraints' into 11054-on2-delete

Conflicts:
	components/server/src/ome/services/chgrp/ChgrpStep.java
	components/server/src/ome/services/graphs/GraphStep.java
Attempt to add DeleteValidation steps for Filesets

Images are currently deletable from a Fileset. This
is the last requirement to have all of delete/chgrp
of MIFs working (at least from within DoAlls).

This change, however, does not work as intended
since it doesn't perform the validation late enough:
the Fileset objects have not yet been deleted after
the Dataset delete operation.
Revert "Attempt to add DeleteValidation steps for Filesets"

This reverts commit e14688d50eb8e65be68b65542ac0c8deb2ee7350.
Add finish() phase to IRequest (See #11045, #11054, etc)

Now that Fileset handling is happening after containers and
images, it's necessary to have a phase hook which checks that
all filesets have been deleted along with the related images.

This amounts to a trigger pre-commit, but that's not provided
by postgresql. Instead, we collect all of the fileset IDs in
the DeleteStep instances and then check that they have been
removed afterwards. The primary drawback is that this no longer
provides a GraphConstraintERR but rather just a regular ERR.

See #10846

Note: if this requirement is ever removed, the entire finish()
phase could be rolled back. Alternatively, this could replace
the ChgrpValidation steps.
Re-enable lost validation
Migrate ChgrpValidation to finish() at end-of-tx

Like DeleteValidation, properly validating the conditions
as one would in a trigger is best done at the complete end
of the transaction to prevent ordering issues.
Migrate ChownValidation to finish(), too