Central transaction repository

This introduces KernelTransactions, a central repository of transactions. This is used for stopping running transactions on kernel stop, which in turn is meant to resolve a long set of issues related to transactions completing after the kernel is stopped.

The way this works, performance wise, is that transactions are allocated up-front in a marshland pool. References to every transaction created are kept in a global set, but since this is only written to when populating the pool, there is next to no contention on this data structure.

To find running transactions, we iterate over the set, and return the ones that are "running". This list may be out of date, since we may read stale flags to tell if the tx is open (the flags are non-volatile). For our use case, however, this is not a problem. 

Marshland pool significantly improves the cost of creating new transactions, but we will need to expand it to cache more than one transaction per thread I think, or we will see contention on transaction creation in the transactional endpoint in the server as marshland falls back to the linked queue pool. That will come in a separate PR.