SI-7060 More conservative dead code elim marking

In dead code elimination, a DROP instruction that gets marked as useful
and can be reached via several paths needs to also mark all the reaching
definitions as useful, else we'll get unbalanced stacks on the two paths.

A simplistic example:
```
BB1:
  CALL X       // useful, leaves a LONG on the stack
  JUMP BB3

BB2:
  LOAD_FIELD Y // not useful
  JUMP BB3

BB3:
  DROP LONG    // useful because "CALL X" is useful
               // but unless we mark "LOAD_FIELD Y" as useful too
               // we'll get unbalanced stacks when reaching BB3
```

This patch addresses the unbalanced stack problem by adding all the
reaching definitions of a useful DROP as useful instructions too.
[nomaster] SI-6773 Makes the SI-6150 changes binary compatible with 2.10

The back ported fix of SI-6150 1f0e4880ad7ad816fd82c04f6814c5b165f86981
broke binary compatibility. This commit fixes that by removing the
IndexedSeqFactory class and copy/pasting its one method around to
everything that extended it then re-adds some inner
classes needed by the binary compatibility checker.
Merge pull request #2059 from VladUreche/issue/7060

SI-7060 More conservative dead code elim marking
Merge pull request #2064 from JamesIry/2.10.x_SI-6773

[nomaster] SI-6773 Makes the SI-6150 changes binary compatible with 2.10
[nomaster] Revert "SI-5017 Poor performance of :+ operator on Arrays"

This reverts commit 02b2da63409af6a28824cbb74d00d0ec04518c8d.
Merge pull request #2080 from JamesIry/2.10.x_SI-5017

[nomaster] Revert "SI-5017 Poor performance of :+ operator on Arrays"