Thread sanitising via std::enable_shared_from_this

Directory object is changed to be a shared_ptr to avoid various thread problems related to its timer during destruction.

Directory now has to be constructed using the Directory::Create() functions.

The HasPending loop in DirectoryHandler<T>::RenameDifferentParent() is used to ensure that the SetNewParent() operation has completed. It not the final solution, but it works for the purpose.

Yes this is indeed a better/safer approach