Encapsulated MetaData members. Added helper functions for common tasks.

`Directory::ScheduleForStoring()` and `Directory::Add()` both call `Directory::DoScheduleForStoring()` which does the scheduling work. I think `Directory::ScheduleForStoring()` should not be a public method, all the member functions in `File` or `Directory` to create or modify should do the scheduling internally (`Directory` already does this).

However, I apologize because I may have introduced an error. I thought this was cruft because it looked like `DirectoryGandler::GetParent()` was returning the parent twice in a pair (with one being upcast to `Directory`) - which I figured could be fixed in another patch. If both pointers were the same, the extra call to scheduling would be superfluous. However, debugging has shown this to not be the case (the pointers can differ). I think the pair should have pointers to the same object, _unless_ the new path is a directory, then  `.second` should be the grandparent. It looks like you added this function call - do you remember why? It seems like it should moved outside of the non-windows block too.

Also - why was the creation time of the parent or grandparents directory being modified in this situation? That seemed incorrect to me, thus its removal too.

I will do some more investigation later today in all of this - clearly I need to look into it more.