Just n = float lambdas to top level, if
doing so will abstract over n or fewer
value variables
Nothing = float all lambdas to top level,
regardless of how many free variables
Just 0 is the vanilla case: float a lambda
iff it has no free vars

Plugins

Plugin is the core compiler plugin data type. Try to avoid
constructing one of these directly, and just modify some fields of
defaultPlugin instead: this is to try and preserve source-code
compatability when we add fields to this.

Nonetheless, this API is preliminary and highly likely to change in the future.

Modify the Core pipeline that will be used for compilation.
This is called as the Core pipeline is built for every module
being compiled, and plugins get the opportunity to modify
the pipeline in a nondeterministic order.

Attempt to convert a Template Haskell name to one that GHC can
understand. Original TH names such as those you get when you use
the 'foo syntax will be translated to their equivalent GHC name
exactly. Qualified or unqualifed TH names will be dynamically bound
to names in the module being compiled, if possible. Exact TH names
will be bound to the name they represent, exactly.