librustc: Make `Copy` opt-in.

This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.

This breaks code like:

    #[deriving(Show)]
    struct Point2D {
        x: int,
        y: int,
    }

    fn main() {
        let mypoint = Point2D {
            x: 1,
            y: 1,
        };
        let otherpoint = mypoint;
        println!("{}{}", mypoint, otherpoint);
    }

Change this code to:

    #[deriving(Show)]
    struct Point2D {
        x: int,
        y: int,
    }

    impl Copy for Point2D {}

    fn main() {
        let mypoint = Point2D {
            x: 1,
            y: 1,
        };
        let otherpoint = mypoint;
        println!("{}{}", mypoint, otherpoint);
    }

This is the backwards-incompatible part of #13231.

Part of [RFC #3](https://github.com/rust-lang/rfcs/pull/127).

[breaking-change]

r? @nikomatsakis
Can this method be made more generic in order to cover also other built-in traits? 

In my last [PR](https://github.com/rust-lang/rust/pull/14371/files) I had a visitor that would run the checks below for each implementation of a built-in trait.

I like the implementation of this PR better but there's probably something we can rescue from the old one since for other built-in traits we'll need the same checks on fields and variants.