adds support for bytecode diffing to ByteCodeTest
refactor: prepare null check redundancy analysis

this commit doesn't change any behavior
no null check for type-tested unapply arg

pattern matching on case classes where pattern
is not known to be a subclass of the unapply's argument type
used to result in code like:

```
if (x1.isInstanceOf[Foo]) {
  val x2 = x1.asInstanceOf[Foo]
  if (x2 != null) { // redundant
    ...
  }
}
```

this wastes byte code on the redundant null check
with this patch, when previous type tests imply
the variable cannot be null, there's no null check
don't store subpats bound to underscore

also, tweak fix in place for SI-5158 to appease SI-6941
don't store mutable fields from scala.* as we can assume
these classes are well-behaved and do not mutate their
case class fields
no type test if static type <:< primitive value class
SI-6686 drop valdef unused in flatMapCond's block
SI-6941 tests

update ByteCode test to allow for testing bytecode similarity
here, the methods are almost the same (variable load/stores reordered)