Adds subtree_edited_on, subtree_edited_by, and fixes has_changes

has_changes() now checks for changes anywhere its subtree.

@cahrens @andy-armstrong @dmitchell