SI-7096 SubstSymMap copies trees before modifying their symbols

I removed some strange code in a06d31f6a2 and replaced it by something
incorrect: SubstSymMap should never have side-effects: otherwise,
calling 'tpe1 <: tpe2' for instance would modify the symbols in
annotations of tpe2.

SubstSymMap now always creates new trees before changing them.

Comes with a fancy test! I verified that the test fails on 2.10.x before the patch.

Review by @adriaanm