Change the function call chain so that hooking isn't necessary.

Redesign so that UpdateGroups() is called in response to roster or
specialzation updates and it independently calls requests reloading the
layout if the "by-role" layout has changed.  Remove the direct
manipulation of the secure group headers because it can be handled
entirely within GridLayout.

Make the "by-role" layouts make use of more features that can be used in
layouts, as documented in Grid/Layouts.lua.  In particular, use "defaults"
instead of directly setting the same attributes in every group -- using
layout group defaults allows for GridLayout to do the copying for us.
Remove unnecessary UpdateGroups() call in PostEnable().

Grid generates a Grid_RosterUpdate event shortly afterwards which will
cause UpdateGroups() to run.
Push the code that grabs cached LibGroupInSpecT info into GetRole().

As the __index metamethod, they were interfering with checking for old
roles of existing GUIDs.  This makes the functions associated with
ROLE_CHANGED_INFORM and GroupInSpecT_Update actually do something.
Switch from using Grid_RosterUpdate to Grid_UnitJoined/Grid_UnitChanged.

The latter two events are more fine-grained and we were scanning the
entire roster on each update with Grid_RosterUpdate.  Switching to the
other events allows for updating a single unit at a time for better
efficiency.
Use binary search instead of scanning the entire name list.