EXPERIMENTAL: Disambiguate names in a block

Syntax: with <names list> expr
In the expr, if there are any ambiguous names which are defined in any
of the modules in the <names list>, restrict the options to that list.

e.g.

*disamb> with List [1,2,3,4]
[1,2,3,4] : List Integer

*disamb> with List [[1,2],[3,4],[5,6]]
[[1,2],[3,4],[5,6]] : List (List Integer)

*disamb> with Vect [[1,2],[3,4],[5,6]]
[[1,2],[3,4],[5,6]] : Vect 3 (Vect 2 Integer)

-- Fails since both options work
*disamb> with Vect, List [[1,2],[3,4],[5,6]]
Can't disambiguate name: Prelude.List.::, Prelude.Vect.::

-- Succeeds since only one option works
*disamb> with Vect, Stream [[1,2],[3,4],[5,6]]
[[1,2],[3,4],[5,6]] : Vect 3 (Vect 2 Integer)

This is really intended for disambiguating more complex or awkward
things, e.g. (>>=) can be disambiguated as follows:

foo = with Effects do
         putStrLn "Hello"
         --- etc