split pool fork join f x computes 
f x by leveraging multiple
    threads from 
pool.
    The 
fork function is used to determine for a given input value
    whether the computation should be split (returning 
Some (x1, x2)
    will generate two sub-computations with inputs 
x1 and 
x2) or not
    (returning 
None). The 
fork function is recursively called inside
    sub-computations.
    The 
join function is used to combine the results of two
    sub-computations.
    Raises an exception if any call of 
fork, 
join, or 
f raises an
    uncaught exception, or if the passed pool cannot execute the
    computation.
    As an example, a (very inefficient) way to compute the fibonacci
    function using several threads is:
    
  let rec fib n =
    if n <= 1 then
      1
    else
      (fib (n - 2)) + (fib (n - 1))
  let threshold = 10
  let fork n = if n < threshold then None else Some (n - 1, n - 2)
  let join x y = x + y
  let parallel_fib n = split pool fork join fib n
.