Fixed #264 - failure to typecheck GADTs

The previous scheme derived the right bounds, but then failed to use them
because a TypeRef already has a set info (its bounds). Changing the bounds in
the symbol by a side effect does not affect that. This is good! But it showed
that the previous scheme was too fragile because it used a sneaky side effect
when updating the symbol info which failed to propgate into the cached
info in TypeRef.

We now keep GADT computed bounds separate form the symbol info
in a map `gadt` in the current context.

Closes #268. (Branch got wrong ticket number due to a typo).

This encaspulates the ability to assign a new map, but leaves the door open for anyone to mutate `GADTMap#bounds`.

I'd prefer to see something like:

```scala
class GADTMap {
  private var bounds = new SimpleMap
  def narrowBounds(sym: Symbol, bounds: TypeBounds): Unit = {
    bounds = bounds.updated(symbol, bounds)
  }
  def apply(sym: Symbol): TypeBounds = bounds(sym)
}
```