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.
Should events have a lock attribute perhaps?  Then you could use `with event.lock():`.