Add lifetime bounds on Items and MutItems.

This also required a fix for Vec's MoveItems. This resolves issue #16941
It may be somewhat important for this to stay as pointers for non-zero sized types, since casting to integers looses optimisation information, e.g.

```rust
let end = if mem::size_of::<T>() == 0 {
     (p as uint + self.len()) as *const T
} else {
     p.offset(self.len() as int)
};
```

I would be very interested in seeing this not reencode the iteration, but I guess this may not be possible.