add eventing to features to allow for better performance in branch lookups

I added basic eventing in order to handle name updates on features/branches. That way I was able to remove the .Trim().ToLower() from name lookups. 

The trim is now handled in the set{} on the feature and the ToLower is not necessary because I switched from a list to a dictionary with an ignorecase comparer.

If a feature name is changed it is pulled and re-added to the dictionary by the feature-changed event.

IMO, eventing can be used extensively in this project to handle branch changes on the fly.