Basic proof-of-concept. Still very limited.
Basic proof-of-concept. Still very limited.

This commit adds basic type bound support. With it, you can
do the following:

    Lambda[`a <: Foo` => ...]
    Lambda[`b >: Bar` => ...]
    Lambda[`c` >: Bar <: Foo` => ...]

You can also use dots in the type bounds, e.g.:

    Lambda[`a <: scala.runtime.RichInt` => ...]

Not yet supported:

 * Parameterized bounds, e.g. `a <: List[Int]`
 * Mixin bounds, e.g. `a <: Foo with Bar`
 * Existential bounds, e.g. `a <: Foo[X] forSome { type X }`
 * ...and probably much more

It's not clear how to proceed here. Reimplementing the entire
parser in this plugin is clearly a bad idea. But at least some
of the unsupported bounds are probably important.

One option is to figure out a basic set of "supported bounds"
and fail the compilation with a nice, human-readable explanation
that the bounds were not supported if "invalid" bounds are seen.

Works towards fixing #5.

drstevens/kind-projector,malcolmgreaves/kind-projector,non/kind-projector