WIP: OPTICS clustering

Added an implementation of the OPTICS clustering algorithm. OPTICS does not by itself produce a set of labels for the samples so we have also implemented a hierarchical cluster extraction algorithm.

As of now, both implementations are located in the ```optics_.py``` file, but the extraction algorithm should probably be refactored out. OPTICS can have several different ways to produce labels from its set of reachability distances and its ordering so a modular approach to the extraction methods would be preferred.

We currently use scipy to calculate distances between samples instead of the built-in ```pairwise_distances``` in order to reduce memory consumption.

// [Fredrik Appelros](https://github.com/FredrikAppelros) & [Carl Ekerot](https://github.com/CarlEkerot)