I implemented the Lasso select in Scatter. There are still some kinks.

But basically, this is probably the framework that we'll be using!
The main obstacles to tackle:
rethinking how SelectionHub.select() should work, now that we might use the Lasso to select multiple unrelated structures.
The previous selection methods always assumed you wanted a single structure plus all its children, but now we might want to split these into two use cases:
1. You pick an object and want all its children
2. You pick a handful of unrelated objects and you don't want their children

in which case it might make sense to reimplement (1.) as a special case of (2.) which activates when you pass the select() function a single structure (and then it goes and populates the selection with all the children before passing it along to the plots) or something like this. You see what I mean?

This kind of thing would necessitate changing some of the logic in, e.g. BasicDendrogramViewer._update_lines() which calls DendrogramPlotter.get_lines() which has the code ```structures = structure.descendants + [structure]``` implying that when you plot some lines you always want descendants. I'm not super sure how hard I want to fix that, but if we wanted to have a perfect logical correlation with the scatter plots you circle and the specific branches that get highlighted, we would need to circumvent this "get all descendants" logic.
Minor style change: list(blah) instead of [x for x in blah]
Implemented non-subtree selections, so that Lasso select can work.

Fairly substantial change -- I've tested it decently well and I think it works great!
For most situations the syntax doesn't change but in some cases it does.

I think the only thing left "dangling" is that contour selection still only uses the "zeroth" struct, so I gotta use a loop in that case.
Implemented contours to add together for unrelated structures.
Made plot_tree conform to the new signature of get_lines.
Added screenshots to the docs.
Updating documentation readmes with lasso selection.
Added a real docstring to Scatter. Borrowed from an online example.
Addressing Chris's style suggestions.
Fixed bug: crashes when no points are selected in lasso.
Deleted all code referencing widget locks for lasso. Too extreme?

Well, it solved my problem - I don't even know what the locks were for.
Memoize catalog statistics for speed

See #114
tweak input types for caching
Merge pull request #115 from ChrisBeaumont/memoize

Memoize catalog statistics
I implemented the Lasso select in Scatter. There are still some kinks.

But basically, this is probably the framework that we'll be using!
The main obstacles to tackle:
rethinking how SelectionHub.select() should work, now that we might use the Lasso to select multiple unrelated structures.
The previous selection methods always assumed you wanted a single structure plus all its children, but now we might want to split these into two use cases:
1. You pick an object and want all its children
2. You pick a handful of unrelated objects and you don't want their children

in which case it might make sense to reimplement (1.) as a special case of (2.) which activates when you pass the select() function a single structure (and then it goes and populates the selection with all the children before passing it along to the plots) or something like this. You see what I mean?

This kind of thing would necessitate changing some of the logic in, e.g. BasicDendrogramViewer._update_lines() which calls DendrogramPlotter.get_lines() which has the code ```structures = structure.descendants + [structure]``` implying that when you plot some lines you always want descendants. I'm not super sure how hard I want to fix that, but if we wanted to have a perfect logical correlation with the scatter plots you circle and the specific branches that get highlighted, we would need to circumvent this "get all descendants" logic.
Minor style change: list(blah) instead of [x for x in blah]
Implemented non-subtree selections, so that Lasso select can work.

Fairly substantial change -- I've tested it decently well and I think it works great!
For most situations the syntax doesn't change but in some cases it does.

I think the only thing left "dangling" is that contour selection still only uses the "zeroth" struct, so I gotta use a loop in that case.
Implemented contours to add together for unrelated structures.
Made plot_tree conform to the new signature of get_lines.
Added screenshots to the docs.