pair: operations on pairs

```value fst : 'a * 'b -> 'a
```
Return the first component of a pair.
```value snd : 'a * 'b -> 'b
```
Return the second component of a pair.
```value split : ('a * 'b) list -> 'a list * 'b list
```
Transform a list of pairs into a pair of lists: split [(a1,b1); ...; (an,bn)] is ([a1; ...; an], [b1; ...; bn])
```value combine : 'a list * 'b list -> ('a * 'b) list
```
Transform a pair of lists into a list of pairs: combine ([a1; ...; an], [b1; ...; bn]) is [(a1,b1); ...; (an,bn)]. Raise Invalid_argument "combine" if the two lists have different lengths.
```value map_combine : ('a * 'b -> 'c) -> 'a list * 'b list -> 'c list
```
map_combine f ([a1; ...; an], [b1; ...; bn]) is [f (a1, b1); ...; f (an, bn)]. Raise invalid_argument "map_combine" if the two lists have different lengths.
```value do_list_combine : ('a * 'b -> unit) -> 'a list * 'b list -> unit
```
do_list_combine f ([a1; ...; an], [b1; ...; bn]) calls in turn f (a1, b1); ...; f (an, bn), discarding the results. Raise Invalid_argument "do_list_combine" if the two lists have different lengths.