librustc: Require that types mentioned anywhere in public signatures be

public, including in trait bounds and typedefs.

There are three main patterns that this breaks. First is code that uses
private trait bounds in public APIs:

    pub mod a {
        trait Trait { ... }
        pub fn f<T:Trait>() { ... }
    }

Change that code to export the trait. For example:

    pub mod a {
        pub trait Trait { ... }     // note `pub`
        pub fn f<T:Trait>() { ... }
    }

Second, this change breaks code that was relying on
`#[allow(visible_private_types)]`. That lint is now a hard error, and
cannot be overridden. For example:

    mod helper {
        pub struct Foo { ... }
    }
    pub mod public {
        use helper::Foo;
        pub fn f() -> Foo;
    }

Because there is no way for code that uses `public::f` to name `Foo`,
this is no longer allowed. Change affected code to look like this:

    pub mod helper {    // note `pub`
        pub struct Foo { ... }
    }
    pub mod public {
        use helper::Foo;
        pub fn f() -> Foo;
    }

Third, this change breaks code that was relying on being able to
reference private typedefs in public APIs. For example:

    pub mod b {
        type Foo = int;
        pub fn f(_: Foo) { ... }
    }

Change this code to:

    pub mod b {
        pub type Foo = int; // note `pub`
        pub fn f(_: Foo) { ... }
    }

This implements RFC #48.

Closes #16463.

[breaking-change]

r? @alexcrichton
This is an interesting case. I'm not sure what rule from RFC triggered the requirement that `Scope` be public, but it is a case I was wondering about: Here, we implement the `Visitor` trait, which means that conceivably there are functions that reference `Scope` that are visible from outside the module, except that the type we implemented `Visitor` for is itself private. So I think that this change should be unnecessary (I have to write out the rule I propose for impls, but the basic idea is that things that appear in the impl must be public iff the impl is associated with a public type). Is there another path to `Scope` I am not seeing that would warrant it being public