7aaa6422b4
Mainly it's needed to prevent creation of subsituions composition everytime we replacing arguments, because it's both unoptimal and wrong When replace arguments in `A<E, F>` with <String, E> you got `A<String, String>` as a result, that is unexpected. But composition is only needed when previous substituion was abnormal (e.g. RawSubsitution that should actually wrap new arguments), see RawTypes tests