To facilitate experimentation, strip out the base logic of EngineSync into BaseSyncableListener.

This will let us build different implementations of EngineSync that inherit from
BaseSyncableListener. Individual sync behaviors should not change
BaseSyncableListener.
Use SyncableListener* instead of EngineSync* from SyncControl and InternalClock to enforce only using methods we say are allowed via the interface.