Implement name hashing algorithm in incremental compiler

This PR implements the name hashing algorithm.

It starts with number of commits that are refactorings of existing functionality. Those changes structure the core of incremental compiler in a way that is makes it easier to plug an alternative (name hashing) implementation of the invalidation logic. Then we have the main commit 729cc41 which provides the implementation (see the description below). Finally, we have two commits that show what's the difference in behavior between the new and old algorithm when it comes to existing test suite. Here comes description of the main commit:

--- 

Provide implementation of invalidation logic that takes computed name hashes into account. The implementation is spread amongst two classes:

  1. `IncrementalNameHashing` which implements a variant of incremental compilation algorithm that computes modified
     names and delegates to `MemberReferenceInvalidationStrategy` when invalidating member reference dependencies
  2. `MemberReferenceInvalidationStrategy` which implements the core logic of dealing with dependencies introduced by member reference. See documentation of that class for details.

The name hashing optimization is applied when invalidating source files having both internal and external dependencies (in initial iteration), check `invalidateByExternal` and `invalidateSource` methods for details.

As seen in implementation of `MemberReferenceInvalidationStrategy` the name hashing optimization is not applied when implicit members change.

NOTE: All functionality introduced in this commit is enabled only when `IncOptions.nameHashing` flag is set to true.

The `source-dependencies/transitive-memberRef` test has been changed to test name hashing variant of incremental compilation. The change to invalidated files reflects the difference between the old and the new algorithm.

Also, there a few new tests added that cover issues previously found while testing name hashing algorithm and are fixed in this commit. Each paragraph describes a single test.

Add a test case which shows that detect properly changes to type aliases in the name hashing algorithm. See gkossakowski/sbt#6 for details.

Add test covering bug with use of symbolic names (issue gkossakowski/sbt#5).

Add a test which covers the case where we refer to a name that is declared in the same file. See issue gkossakowski/sbt#3 for details.