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. 
On Wed, 19 Nov 2014 11:25:14 -0800, Simon Cruanes wrote:
>
> In case two trees that have a common path to the same leaf are merg 
> ed (basically, two benchmarks have the same path). This means that  
> the two benchmarks are always run together.

So the t there must be a leaf and cannot really recurse?  If so, that 
 invariant must be encoded in the type.  Or do you mean (t list) SMap 
.t — so paths may be merged in the "middle"?