Random cone problems

I added a `random_cone_problem.py` and a `very_large_random_cone_problem.py` (they're the same, I just didn't want to keep toggling parameters). These generate random cone problems (LPs) and ensure they are bounded. You can also directly compute the objective value, which is nice.

These problems are *block diagonal* in structure (so we can see the real effect of partitioning). We can isolate different partitions / covers and determine the effect of the cross-couplings, etc.

I wonder if rewriting some of this in C with OpenMP would be more accurate / faster...