Range.map is now implemented lazily

Under the old implementation, map was implemented eagerly, so an
unneccessary number of intermediate objects might have been created
if another method was chained after map.

eg.
range(10000).map((i) => new List(i)).firstWhere((l) => l.length == 0)
would allocate 10000 lists. The implementation from IterableMixin only
allocates one.

The other methods could be removed, but map is the only one that causes
problems, since it shadows the implementation from IterableMixin

Also, corrected the type declarations for the methods Range.every,
Range.some, Range.forEach and Range.filter.