Node value query now goes through scheduler

Background
-----
Prior to this pull request, any call to ```NodeModel.CachedValue``` property will result in an immediate call to ```EngineController.GetMirror```. Since this call is typically originated from UI thread, it can potentially conflict with ```ISchedulerThread``` which runs in parallel to the UI thread.

This pull request enhances the way ```MirrorData``` is retrieved by going through ```QueryMirrorDataAsyncTask```, ensuring safe access to the underlying ```MirrorData```.

Changes
-----
1. ```NodeModel.RequestValueUpdateAsync``` method now schedules ```QueryMirrorDataAsyncTask``` to retrieve the ```MirrorData``` given the preview variable of a ```NodeModel```. This method is being called right after a prior ```UpdateGraphAsyncTask``` returns, ensuring a node's value is refreshed.

2. ```NodeModel.CachedValue``` no longer call ```EngineController.GetMirror``` and ```RuntimeMirror.GetData``` methods directly. It only returns its ```cachedMirrorData```.

3. ```NodeModel``` only invoke ```RaisePropertyChanged('IsUpdated')``` when its ```cachedMirrorData``` is actually updated (i.e. when ```QueryMirrorDataAsyncTask``` successfully returns with the ```MirrorData``` in it).


Testing scenarios
-----
These are the recommended test scenarios, they represent the areas which are directly or indirectly related to this change:

1. ```Watch Image``` node internally uses ```NodeModel.CachedValue``` to refresh its image after an update happens. Please verify that it continues to work and that subsequent update of any upstream nodes will trigger the right image display.

2. ```Watch``` and ```Watch 3D``` should be tested for their initial value preview, as well as subsequent value updates by modifying upstream nodes.

3. All geometry types (points, lines, surfaces and solids) are to be displayed properly in Dynamo. They are to be updated correctly in subsequent updates, too.

4. ```View > Show Geometry in Revit``` should work properly on **Revit Sundial release** (for points, curves, surfaces and solids).

5. Preview bubbles should be updated correctly when the node (or any of its upstream nodes) is modified. Hovering over a node for its preview bubble should show ```null``` if the underlying computation is still running. In this case, the preview bubble (if shown) should be correctly updated once the computation is done.

Unit tests
-----
Full test run is on-going, to be updated.

Notes to reviewers
-----
Hi guys, you're being identified as the experts in this area, please take a look, thanks! :)

- [ ] @pboyer (because you're primary UI reviewer)
- [ ] @ikeough (because we've been through this thing before)
- [ ] @ke-yu (because you're the man in the ```Mirror```)

[```UpdateGraphAsyncTask.HandleTaskCompletionCore```](https://github.com/DynamoDS/Dynamo/blob/d6a96b1b14be0a50ca917a3dd4a3d545049493d3/src/DynamoCore/Core/Threading/UpdateGraphAsyncTask.cs#L85) is being called by ```DynamoScheduler``` immediately when the task completes. This is where it sets ```NodeModel.IsUpdated = true```. After that, ```DynamoScheduler``` proceeds to raise ```UpdateGraphAsyncTask.Completed``` event, which is then handled by [```DynamoModel.OnUpdateGraphCompleted```](https://github.com/DynamoDS/Dynamo/blob/d03942af1a41aef33de18f84306473550fd80357/src/DynamoCore/Models/DynamoModel.cs#L552) that calls ```NodeModel.RequestValueUpdateAsync``` and sets ```cachedMirrorData = null```. All this happens on the context of ```ISchedulerThread``` so it is impossible (with the current flow) for the sequence to be inverted.