Approx 50% speed boost for List#union

The implementation of List#union is almost the same as List#uniq now. I don't
really like the extra argument used to pass along the state of the lazy
computation. I would like to come up with a general way of creating lazy lists
where some additional state has to be carried along with the lazy list and
passed down to the next node which must be realized.
Approx 2x speed boost for List#at

List#at is strict (there's no way it could be made lazy). So there is no need to
go through creating a chain of lazy list nodes when executing it, as is done by
Add comment on ::Enumerable#to_list implementation
Set#to_set won't change if #dup is redefined
Comment on List construction spec
Additional spec for List.[]
List#[] (and #slice) can take a single index, (from,length) args, OR a Range

The return values mimic those of an equivalent Array. This means that if 'from'
is completely out of range, or 'length' is negative, nil is returned. This might
not be very useful in some cases. Then again, it might help to catch bugs:
there is no logical answer with a negative 'length', and returning nil in such
a case makes it likely that a NoMethodError will be raised shortly after.