LPS-48895 add new RepositoryModelOperation interface

This interface will allow us to execute arbitrary operations on
repository models without using `instanceof` checks and downcasts. Each
model implementation will use double dispatch to choose the correct
method to execute.
LPS-48895 add methods to get all elements in a repo
LPS-48895 add skeleton capability for bulk operations

This capability will be used by the Sync capability to fire sync events
for each file and folder when removing a repository from the DL.
LPS-48895 implementation of bulk capability
LPS-48895 add method to delete all elements

Add a method to fire a DELETE sync event for all files and folders.
LPS-48895 wire in the BulkOperationCapability
LPS-48895 call the sync capability explicitly

We could have attached the call to the `destroy()` capability method to
the (Delete, LocalRepository) event, but in general, we don't want bulk
operations to be executed that way.

Potentially, more than one capability could execute a bulk operation as
part of any event, leading to terrible performance (each bulk execution
would retrieve the whole repository from db page by page). To solve this
problem, we are planning to allow repositories to register, along even
listeners, repository operations to execute when an event is
triggered. This way, the repository would be able to combine all
operations into one and traverse the repository elements only once.

Also, we will probably make bulk operations asynchronous, as they could
potentially take some time to finish.
LPS-48895 test sync behaviour when deleting repository
LPS-48895 autogenerated
LPS-48895 SF
LPS-48895 SF
LPS-49135 SF
LPS-50049 SF