Support nested unit of work scopes and recursive commit calls

- When open a new unit of work scope, the new unit of work is pushed to a stack stored in thread local.
  Events raised in this scope will not be visible to the outside unit of works.
- Post event handlers might need to modify domain model and commit again, in this case,
  we must ensure that only newly raised events are invoked in this 2nd commit