more precise abstract-values in ASM dataflow-analysis

Before this commit, there was only one catch-all mechanism to
create the abstract values of a custom dataflow analyses (DFAs),
namely via Interpreter.newValue(Type)

That state of affairs leads to imprecission, as can be seen
for example when creating a nullness-tracking analysis
(an instance method should have its this variable initially
tracked as non-null).

This commit adds methods to asm.tree.analysis.Analyzer to
allow overridding what abstract values are of interest for:
  - formal params in a method
  - local vars in a method
  - exception on the operand stack on entry to an
    exception-handling block
improvements to ASM dataflow-analysis
BCodeOpt building block: ConstantFolder

Constant folding comprises:

  - loads that are amenable to shorthand (e.g. ICONST_1) are rewritten

  - stores where the LHS already contains the value
    denoted by the RHS are replaced by DROP instruction

  - binary operations with constant result are left in place,
    but a DROP and a load of the constant-result are inserted
    rigth after them. Successive iterations of the fixpoint will
    reduce code to its final form.

  - conditional jumps, as well as lookup and table switches
    are simplified when their operand is constant.
Level 1 intra-method optimiz: ConstantFolder