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)
}
```
I tried this, there's another `Gc` on `Expr`, so I had to use the following (one extra match):

```
   let s = match iter.next() {
        Some(expr) => {
            match *expr {
                ast::Expr  { node: ast::ExprLit(lit), span: sp2 , ..} => {
                    sp = sp2;
                    match lit.node {
                        ast::LitStr(ref s, _) => Some(s),
                        _ => None
                     }
               },
               _ => None
           }
        },
        _ => None
    };
```
`node` doesn't live long enough so I'll have to use `s.clone()` if I don't want to nest the matches further. Should I? Seems a bit unnecessary.