Re-written Dupe Add command

* Currently only supports printing back input paths
* Much cleaner and more idiomatic than previous version
Dupes: Recursively print contents of added paths

* Previously we just printed the root of each added path
* Now we traverse recursively each path and print it out as a PathKey
** Order of the traversal does not exactly match sort order of serialized PathKeys, need to think about this more
* Also removed the export for PathKey's constructor to make sure toPathKey is the old valid way to build one
Dupes: Custom recursion of added paths

* System.Directory.Tree has a fair bit of overhead, we just need a simple recursive traversal yielding a single path at a time
* Re-wrote add with a custom recursive traversal that is faster but less featured
Dupes: Formatting
Wrote a new kind of Machine to allow merging streams

* I don't think it is possible to perform an in-order merge on two ordered
  streams given the default data types of Data.Machine, so I added a new
  one that allows looking ahead at the next yielded value on the left or
  right to see if it exists. An extension of the Wye machine. Have to be
  careful to not create infinitely looping Plan's using this, will think
  about possible better implementations
* Also added a merge streams methods with appropriate quicktest
Dupes: Updated implementation for add that actually stores added paths
Code cleanup to reduce number of warnings
Merge branch 'master' into dupes