Implement support for subtransactions
With the upcoming reference-transaction hook implemented in gitlab-org/gitlab-git!2, we need to extend transactions to support subtransactions. Right now, we know that each transaction will be invoked once only from the pre-receive hook. But with the reftx-hook, each Git operation may call out to a given transaction arbitrarily many times. As we cannot know how often that's going to happen, the transaction needs to cope and allow for multiple votes.
This is where subtransactions will come in. Each vote of a given node is going to create a new subtransaction iff all previous subtransactions for that node have succeeded. If the current transaction is still ongoing or has failed, it is not allowed to take part in new subtransactions. The outcome for each given node is then either success
if all subtransactions have reached quorum on the same thing as the node voted for, failure
if any subtransaction arrived at a different thing or not started
if none of the nodes has created a subtransaction.