Feature chebop2 interface

Updating Chebop2 so that it can accurately compute the (splitting) rank of a variable coefficient partial differential operator.  This feels like a BIG step forward to me as we don't just compute the rank, but also a corresponding low rank representation (separable representation).  A rank determining algorithm is particularly important for Chebop2 because rank 1 and rank 2 PDOs are very efficient to solve compared to higher rank operators. Automatically spotting these PDOs is crucial.    

For instance, we now spot that Helmholtz with gravity is rank 2 (before we calculated rank 3): 
```
N = chebop2(@(x,y,u) laplacian(u) + (10 + y).*u); 
rank(N)
ans =
     2
``` 
Other examples include the time-independent Schrodinger equation and the Black-Scholes equation. 

If one wants to see the separable representation, then do: 
```
[U, S, V] = chebop2.SeparableFormat( N ); 
```

We compute a separable representation of a PDO using a thrilling mix of tensor-train decompositions, 2D low rank ideas, and umbral calculus.

Closes #1165. Closes #1164.