BatList: fix BatList.n_cartesian_product [] = assert false

`BatList.n_cartesian_product [] = assert false` is clearly a bug.
Add a case `[] -> [[]]` because [[]] seems to be one right answer mathematically.
Remove the case `[l] -> List.map (fun i -> [i]) l` because it becomes unnecessary.

Add unit tests for n_cartesian_product.