Add a new context manager, Widget.hold_sync(), which holds any syncing until the manager exits

Sometimes for consistency or efficiency purposes, it makes sense to update
a group of properties all at once.  This context manager makes this possible.

We also fix a bug where send_state was not passing the key on to get_state.
Before syncing a widget's state, check first for the property lock, then for the widget state lock
Merge pull request #6296 from jasongrout/sync-hold

Add a new context manager, Widget.hold_sync(), which holds any syncing until the manager exits