[2.2] Resolve two race conditions relating to HA lock sessions

- Add a check ensuring a slave commit has a running lock session when committing,
  or has explicitly opted out from having one.
- Move lock session management into its own class, where timeouts and concurrent
  access can be tested in isolation.
I would argue about this, because I think Provider and Factory have different semantics - but the way this is used in the code in this PR, factory is a better fit in any case :) Changing this.