Refactor NeoStoreDataSource

Refactors NeoStoreDataSource into modules, and introduces Recovery,LogRotation, and LogPruning as separate processes.

The recovery process now works on its own channel to the underlying logs, so there is no longer any assumption that after recovery PhysicalLogicalLog can continue with the same channel. Instead it opens its own channel and moves to the end.

UpdateableSchemaState and its implementation didn't have anything to do with IAGD, so it was moved into NSDS.

Log pruning is now a separate process, that uses monitor callbacks to trigger when to run.
Monitors are essentially implementing the Observable pattern. What to do on those callbacks is arbitrary really. The old way, where the observed object explicitly had to know about things depending on it, and do them explicitly, is not very good. Whether the observer should do the work in the monitor callback or on a separate thread is really the issue. In this particular case I think it's fine, but there's no hard rule about it.