Fix/bounds propagation v2

Adds full bounds propagation and fixes quite a few other problems that were detected in the progress.  Review by @retronym please.

Note: The encoding of parameterized types as refinement types requires bounds propagation for dotty. It's not optional, nor can it be restricted to pattern matching. In fact, there's nothing to propagate. Instead, when comparing refined types, we always need to take all bindings into account, which gives us bounds propagation for free.
Should this also treat `SuperType`? 

```scala
trait T { type X }
"": (T { type X = Int; type U = super[T].X })#U
```

```
sandbox/test.scala:16: error: type mismatch:
 found   : String("")
 required: Super(C.this.T{X = Int; U = super.X}).X
  "": (T { type X = Int; type U = super[T].X })#U
  ^
```

I also tried this somewhat silly example, not sure what to make of the results.

```scala
"": ({ type U = this.type })#U
```

```
sandbox/test.scala:18: error: type mismatch:
 found   : String("")
 required: Object{
  U =
    Object{
      U =
        Object{
          U =
            Object{
              U =
                Object{
                  U =
                    Object{
                      U =
                        Object{
                          U =
                            Object{
                              U =
                                Object{
                                  U =
                                    Object{
                                      U =
                                        Object{
                                          U =
                                            Object{
                                              U =
                                                Object{
                                                  U =
                                                    Object{
                                                      U =
                                                        Object{
                                                          U =
                                                            Object{
                                                              U =
                                                                Object{
                                                                  U =
                                                                    Object{
                                                                      U =
                                                                        Object{
                                                                          U =
                                                                            ...(
                                                                              ...
                                                                            )
                                                                        }(this)
                                                                    }(this)
                                                                }(this)
                                                            }(this)
                                                        }(this)
                                                    }(this)
                                                }(this)
                                            }(this)
                                        }(this)
                                    }(this)
                                }(this)
                            }(this)
                        }(this)
                    }(this)
                }(this)
            }(this)
        }(this)
    }(this)
}#U
  "": ({ type U = this.type })#U
  ^
```