add set data type, and some itertools equivalents

set(a,b,c,...) or set([list]) creates a set, i.e. it contains the arguments with duplicates removed.
union(set,set), intersection(set,set) and set-set are defined.

This also adds some new functions to do with lists/sets, aping the python itertools module:
product(list1,list2,list3,...) - cartesian product of the arguments
combinations(list,r) - all sorted r-tuples of elements from list, with no repeated elements
combinations_with_replacement(list,r) - as above, but with repeated elements
permutations(list,r) - all r-tuples (in any order) of elements from list, with no repeated elements
add set(range)

Just in case you want to do something like intersection(set(a..b),set(bla))
fix list(set)
add `in` operator; `set and set` and `set or set`

test whether an element is in a list/set/range, e.g. `1 in [1,2,3]`

`set and set` is now a synonym for `intersection(set,set)`, and `set or set` for `union(set,set)`

All this so you can say `1 in (set(1,2,3) and set(2,4,6))` instead of `1 in set(1,2,3) and 1 in set(2,4,6)`
add map(expr,[names],[list of lists])

Suppose you've got a list of 2d coordinates [[x1,y1],[x2,y2],...].
You can now give names to each of the components in the thing you're mapping, e.g.:
	map(sqrt(x^2+y^2),[x,y],coords)
this is the same as Python's:
	for x,y in coords:
		yield sqrt(x**2+y**2)

map also works on sets now