Implement slicing syntax.

`expr[]`, `expr[expr..]`, `expr[..expr]`,`expr[expr..expr]`

Uses the Slice and SliceMut traits.

Allows ... as well as .. in range patterns.

r? @pcwalton (or anyone else)

closes #17177
Obviously I'm not a fan of these method names…are they unavoidable? Can we maybe try `slice_mut` if it's present so we can change this backwards compatibly?