Use symlinks, and symlink entire subdirectories where possible instead of recursing

This greatly improves performance.

This change in the algorithm also cleans up some capitalization edge
cases. We now always throw an error when we encounter inconsistent
capitalization, which ensures consistent behavior between case-sensitive
and case-insensitive file systems.

---------------

@rjackson, I don't think the history on the symlink branch is terribly meaningful at this point, so I've squashed the symlink branch into a single commit with shared authorship. I re-read the diff and it looks fine to me.

Is there anything else we need to think about before we merge this into master? I can't think of anything off the top of my head.

Hit the merge button if you feel good about this. :)
So the [`mergeRelativePath` function](https://github.com/broccolijs/broccoli-merge-trees/blob/28d6d5a50d628a0182203354ef466f5452d1945a/index.js#L27) basically consists of `readdir`, followed by three parallel 2D `for` loop blocks. (Parallel in a syntactic sense, not executing in parallel.) We could extract those loop blocks into functions, but it wouldn't amount to much more than giving them names.

For what it's worth: The merge algorithm is inherently somewhat complex, because we need to deal with all kinds of edge cases. This is the basically the simplest way I found to express it.

I'm open to suggestions though if we can make it simpler or clearer.