Split CachingGitDataStore in ZkDataStore and GitDataStore
Add profile registry locking. Make ProfileRegistry.getProfile() atomic
Use executeRead/executeWrite instead of generic gitOperation
Use explicit requireCommit/requirePush with GitContext
Only push when there was a commit. Notify on every successful commit
Prepare createProfile/updateProfile for atomic with single commit
Explicitly requirePull through the GitContext
Make GitDataStore.createProfile() atomic with single commit
Make GitDataStore.updateProfile() atomic with single commit
Reset the workspace (hard) before we do a pull
Recursively create/update parent profiles