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.
I found the *right* solution: use a utility method to calculate the bounds as needed, and use a `copy` of the events for the `onselect` callback.