Add syntax extensions for lowercasing/uppercasing strings (Fixes #16607)

Testcase:

```
 #![feature(macro_rules)]
macro_rules! identify (
  ($i: ident) => {
    let $i = to_lower!(stringify!($i));
  }
)

fn main() {
    println!("{}", to_lower!("FooBar"))
    println!("{}", to_lower!(stringify!(FooBar)))
    println!("{}", to_upper!("FooBar"))
    println!("{}", to_upper!(stringify!(FooBar)))
    identify!(FooBar);
    println!("{}",FooBar)
}
```
This is hard to read, with all the rightward drift. Ideally you could compress this into a single `match`, but I don't think you can match the `Gc` in `ExprLit`. We can at least get rid of one of the `match` levels, and remove the `return` from the inside of this big beast:

```rust
let s = match es.move_iter().next() {
    Some(codemap::Spanned { node: ast::ExprLit(lit), .. }) => match lit.node {
        ast::LitStr(ref s, _) => Some(s),
        _ => None
    },
    _ => None
};
match s {
    Some(s) => {
        let new_s = s.get().chars().map(transform).collect::<String>();
        base::MacExpr::new(cx.expr_str(sp, token::intern_and_get_ident(new_s.as_slice())))
    }
    None => {
        cx.span_err(sp, "expected a string literal");
        base::DummyResult::expr(sp)
    }
}
```