Analyze constants to remove unnecessary branches

This commit adds analysis and optimization of constants to remove
unnecessary branches. It uses abstract interpretation to determine
what constant(s) a particular stack slot or variable might or might not
hold at a given spot and uses that knowledge to eliminate branches that
cannot be taken. Its primary goal is null check removal, but it also
works for other constants.

Several tests are modified to include the new optimization phase.

Two new tests are added. One verifies that branching still works as
expected. The other verifies that branches are removed.
Cleanup of constant optimization

This commit cleans up constant optimization from the review of
https://github.com/scala/scala/pull/2214 .

* drops are done using the instruction's consumed count rather than a
  numeric literal
* drops are moved into one common method in the main instruction
  interpreter
* One instance of x.length > y.length is replaced with
  x.lengthCompare(y.length) > 0
* NaN is dealt with by treating it as an UNKNOWN
* A test is added to make sure NaN semantics aren't broken.
* The constant-optmization test is improved with tests for switch
  statements
Merge pull request #2214 from JamesIry/master_constant_optimization

Analyze constants to remove unnecessary branches
SI-7251, compiler crash with $.

We don't need to assert our way out of tight spots, we can
issue an error.