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
let's not worry about `TagHelperExpression<TValue>` for now.  as mentioned earlier, it's a special case we don't need in the initial implementation.  the only thing the `TValue` type parameter does is limit the expressions the user can type.  we don't have IntelliSense to help is there (yet). and the tag helper author can throw if the expression result has the wrong type, working around the compilation errors `GetTagHelperExpression(Expression<Func<TModel, bool>>)` would give in that case.