Improved selection widget

This is in preparation for enhancing the selection widgets as per #3486.

This expands the new `_Selector` class from #3376 and normalizes the API for the three current selection widgets: `RectangleSelector`, `LassoSelector`, and `SpanSelector`.  

The only known API change is that the ignore criteria from the `RectangleSelector` are now used for all three, since they were the most complete and robust.  

This also adds tests for all three widgets.
flip this to `self.canvas is not None` please.