Implement range syntax

Closes #19794

r? @aturon for the first patch
r? @nikomatsakis for the rest
Can these be derived?