Add _Transaction.modified_set, a set which holds vars/weakrefs whose watchers need to be re-run at the end of the transaction
TWeakRefs now properly re-run their watchers when their referents are garbage collected.

Also use the weakrefset module as a fallback for when weakref.WeakSet doesn't exist (like on Python 2.6). A handful of watch-related bugs in TWeakRef have been fixed as well.