add a tree-like system to run sets of benchmarks

A system a bit similar to `OUnit`, with the ability to select only a subset of the benchmarks to run them. As each benchmark can take a significant time, it is convenient to be able to run only the ones that are relevant to some function, say, if we are trying to improve this function's performance.

There is also a small patch to `_oasis` because it wouldn't compile with a recent version of `oasis` otherwise. 
```
val (>:) : string -> (unit -> samples) Lazy.t -> t
```

> Could you please explain why `(unit -> samples) Lazy.t` and not `samples Lazy.t`?  Is it because you want to rerun the same test several times?  If so, `unit -> samples` is enough (and once run, it is the job of the functions of `Tree` to keep the `samples` as needed).

Yes, the point of `unit -> samples` is that we might want to run the
same benchmark several times; the `lazy` is for initialization code.

I found, with my preliminary version, that building  the whole tree of
benchmark for printing it (the `-tree` option) took time because of some
initialization code required for benchmarking (e.g. creating huge
lists/vectors to be used by benchmarks). Alternatively, maybe allowing
a `('a -> 'b) -> 'a Lazy.t -> samples`  in `throughtputN` and the likes
could solve this initialization problem?