fusion of loops in Range.foreach() and Range.validateRangeBoundaries()

This commit allows closure elimination in more cases. The non-inlined case also benefits from saving a Range.validateRangeBoundaries() invocation.

Before this commit, the closure argument to Range.foreach() escaped to Range.validateRangeBoundaries(). As a consequence, closure elimination required inlining both of them. Given that the current optimizer duplicates a closure body whenever that closure's apply() is invoked, the resulting code size taxed the JIT compiler. In particular when apply() delegates to a specialized version, or when a bridge apply() stands in the way.
nested closures are flattened by calling supplementErrorMessage() directly

A closure C that becomes an argument to the constructor of another closure makes both closures harder to eliminate (either by scalac-optimizer or JIT-compiler) than is the case when C is the argument to an @inline method.
comments on avoiding closure allocation in Global's assert() and require()
Merge pull request #1825 from magarciaEPFL/fusion-Range-foreach

fusion of loops in Range.foreach() and Range.validateRangeBoundaries()
Merge pull request #1830 from magarciaEPFL/unnest-closures-supplementErrorMessage

nested closures are flattened by calling supplementErrorMessage() directly