List.end Considered Harmful

All the .pairs-like list methods calculated .keys first, then looked
up everything using at_pos.  Unfortunately, to determine the key list,
the .keys method called self.end, which enforces finite semantics.  This
seems a bit suboptimal in a language that professes to support infinite
lists.  So now instead of mapping the keys, we map the values, and create
the keys as needed.  Performance seems roughly the same.