Application of changes by the ChangeManager is extremely slow

Details

Description

Now that the SessionChangeManager applies all of the changes at the end of the RichDocument's tag processing, change application is extremely slow. This is because the ChangeManager needs to call invokeOnComponent for each change and there is no removal of duplicate changes. Since many components add a new attribute change every time the component is manipulated-splitters, disclosure components, tables, etc. The SessionChangeManager overhead becomes higher and higher the more time that the user spends interacting with the page. The solution is to collapse the most common changesattribute changes-together to decrease the number of changes that need to be applied on each request. (Another fix would be avoiding application of changes where the component state already includes the change). The complicating factor in collapsing changes is that the MoveChildComponentChange can cause the clientId of a component to be modified so that the current clientId of the component doesn't match the clientId that an earlier change was recorded against. The solution to this problem is to track the MoveChildComponentChanges and build a mapping table to Map current clientIds to earlier clientIds as we iterate through the change list looking for matches.