librustc: Forbid `transmute` from being called on types whose size is

only known post-monomorphization, and report `transmute` errors before
the code is generated for that `transmute`.

This can break code that looked like:

    unsafe fn f<T>(x: T) {
        let y: int = transmute(x);
    }

Change such code to take a type parameter that has the same size as the
type being transmuted to.

Closes #12898.

[breaking-change]

r? @alexcrichton
Can parts of this function be refactored into separate methods? This gargantuan tower of indentation and three-lines-per-function-call is an eyesore.