Fix #1144: Inline away for-ranges

The first 3 commits add a few simple improvements to the IR and optimizer.

The 4th commit adds insane optimizations for `Long`s, getting rid of as many of them as possible. There's even one case that says that
`e1.toLong + e2.toLong > 2147483647L` (`Int.MaxValue.toLong`),
where `e1` and `e2` are `Int`s, is equivalent to:
```scala
{
  val x = e1
  val y = e2
  (x > 0 && y > 0 && x+y < 0)
}
```

The last commits actually change `Range` to make it inlineable.
Well, yes and no. The rationale here is that alternatives in a `Match` are not *expressions* and can never be transformed as such (it's completely non-sensical). They have a very specific role here which is closely tight to `Match`. So *if* you need to transform them, it is 100 % certain you'll have to treat them specially in the transformation of `Match` anyway. It wouldn't be `transformLit`, but rather `transformMatchAlternative`, and that would make it completely useless.

This is the same reason why `name`s in a `JSObjectConstr` are not transformed (although sometimes they are `StringLiteral`s).