File Watching and Improved File Library: MAGN-2648

This PR contains new nodes for dealing with files in Dynamo.

#### Watching Files
In order to read the contents of a File, the path to the location on disk is passed to a `File.FromPath` node. This node returns File "objects" that are used to keep the graph in sync, similar to how our Revit wrappers work. Any change to the watched file or directory marks the `File.FromPath` node as dirty, thus marking any downstream node as dirty.

#### Reading from Files
Reading is a non-destructive operation (as opposed to writing, which overwrites any old data), and so all read operations accept File objects (result of the `File.FromPath` node). That way, any changes to the filesystem will be reflected in the graph, and the read nodes will automatically update because the upstream `File.FromPath` node has been updated.

#### Writing Files
Writing is a destructive operation, and we don't want the graph to automatically write a file just because the file on disk changed. Because of this, writing nodes accept the file path as a string, *not* a file object. Writing nodes will still update automatically if either of the inputs (the path or the contents) change, but if the file being written to is changed externally, Dynamo will not automatically overwrite the new changes.

#### Images
Images are technically a specialized form of file reading; instead of reading the contents to a string, the contents are instead processed as a bitmap. Because this is a type of read operation, the `Image.FromFile` node accepts a File object as an input. Currently, Bitmaps can be written to files, have the pixels extracted as color data, and be displayed in the `Watch Image` node (soon to be merged into the regular `Watch` node).

#### Other additions
In order to facilitate working with paths, I've introduced a new `FilePath` library for manipulating string that represent file paths. Also, I've mirrored a lot of the file functionality for Directories as well, by providing a `Directory.FromPath` node and a `Directory.Contents` to get all of the contents of a directory.

-------
##### Reviewers
* [ ] @aparajit-pratap 
* [ ] @ikeough 
* [ ] @lukechurch 

##### Merges
* [ ] Revit2015
As discussed, lets move this into a IDispose call to make it easier for existing users to understand