Optimize boundSyms by avoiding needless call to typeOfThis
Optimize boundSyms by avoiding needless call to typeOfThis

This method is call in symbol substitution, which is a hot
path during typechecking.

This commit observes that certain types of types don't define
any bound symbols, and immediately returns an empty set.
These types of types are:

    ThisType     this.type
    SuperType    A.super.B
    ConstantType 42
    SingleType   foo.type
    TypeBounds   >: L <: B

When a type reports an empty set of bound symbols, symbol substution
_does_ recurse into the compoments of the type (with `mapOver`), so
we still find bound symbols, for instances, an existential type in
one of the type bounds.

Before this commit, calling `ThisType#boundSyms` came to the same
result via the implementation inherited from `SimpleTypeProxy`, which
incurred an needless call to `ThisType#typeOfThis`.

lrytz/scala,lrytz/scala,martijnhoekstra/scala,martijnhoekstra/scala,martijnhoekstra/scala,scala/scala,lrytz/scala,lrytz/scala,scala/scala,lrytz/scala,martijnhoekstra/scala,scala/scala,scala/scala,scala/scala,lrytz/scala,scala/scala,martijnhoekstra/scala,martijnhoekstra/scala