Tag helpers registration system

- This registration system accepts tag descriptors that it then uses to feed requests for tag helpers.
- Added some infrastructure pieces that are used to build up valid tag helper descriptors.

#70
comments earlier in this file say this method returning null means the passed type isn't a generic type.  actually the only case in which this would return `null` is for the open generic type `TagHelperExpression<>` itself (not the closed generic `TagHelperExpression<string>` or whatever).  Further this code is tolerant of the loop above ending at `Dictionary<string, object>` even though that can't happen.