Implement collection observing

* use `ObservedDict` and `ObservedList` in `observed_collection` module
* `Player` now uses observed collections to implement condition and inventory, so that a message to the client can be automatically generated whenever these dictionaries are updated
* `Game` now uses observed collections to implement _players list, so that a message to the client can be automatically generated whenever the list is updated
Merge branch 'development' into facility_objectify
Upgrade facilities to classes

* facilities will handle player join and leave, players should not modify their own `current_facility` attribute (formerly `current_job`)
Remove `Player` methods that change inventory and condition

* inventory and condition are now directly changed using the attributes