Introduced separate class for Nystrom method.

The Nystrom method is interesting in its own right, and not only within the context of the LowRankGPModelBuilder. We have disentangled the logic of the low-rank approximation from that of the Nystrom method and put the code for computing the Nystrom method into its own class.
@marcelluethi not sure why you need to populate both domainPoints and shuffleDomainPoints, since domainPoints is not used... Also push_back on std::vector is not an efficient method when you know the size of it...
I don't what what's the type of DomainPointsListType, but you could either do
```c++
std::vector<PointType> shuffledDomainPoints( domain.GetDomainPoints().begin(), domain.GetDomainPoints().end() );
```

or

```c++
std::vector<PointType> shuffledDomainPoints( domain.GetDomainPoints() );
```