Propagate coercions through match expressions.
auto merge of #19769 : nick29581/rust/coerce-if, r=nikomatsakis

r? @nikomatsakis 

We discussed coercions for `if` and `match` expressions. `if` seems to work already, was there some specific behaviour which wasn't working?
libcollections: use `#[deriving(Copy)]`
libcore: use `#[deriving(Copy)]`
libfmt_macros: use `#[deriving(Copy)]`
libgetopts: use `#[deriving(Copy)]`
liblog: use `#[deriving(Copy)]`
librand: use `#[deriving(Copy)]`
librbml: use `#[deriving(Copy)]`
libregex: use `#[deriving(Copy)]`
librustc: use `#[deriving(Copy)]`
librustc_borrowck: use `#[deriving(Copy)]`
librustc_driver: use `#[deriving(Copy)]`
librustc_llvm: use `#[deriving(Copy)]`
librustc_trans: use `#[deriving(Copy)]`
librustc_typeck: use `#[deriving(Copy)]`
librustdoc: use `#[deriving(Copy)]`
librustrt: use `#[deriving(Copy)]`
libserialize: use `#[deriving(Copy)]`
libstd: use `#[deriving(Copy)]`