Make `SelectionWidget.values` a dict

rename 'labels' and '_value' to 'value_names' and 'value_name'.

To specify a mapping of value names and values, use a dict.
If you specify `values=[list]`, then an OrderedDict will be used.

Assignment after construction only supports a dict.
value_names is read-only
don't allow empty selection in selection widgets

raises KeyError on failed lookup (in both directions)
update selection test with null selection being invalid
Merge pull request #5012 from minrk/selection-dict

Make `SelectionWidget.values` a dict