Add ability to resolve all TagHelperDescriptors with one method call - DTH Communication Part 2

*This PR consists of several different aspects entailed by #214. It essentially covers bullet points 4-5.*

Add ability to resolve all `TagHelperDescriptor`s with one method call.
- Modified the `AddOrRemoveTagHelperSpanVisitor` to no longer manage `TagHelperDescriptor`s found in the system. Instead it now manages `TagHelperDirectiveDescriptor`s which are then used to resolve `TagHelperDescriptor`s.
- Changed the signature of `ITagHelperDescriptorResolver` to take in a `TagHelperResolutionContext` which will allow us to pass more information without breaking tooling.
- `TagHelperDescriptorResolver` now resolves all `TagHelperDescriptor`s at once and manages descriptors found in the system based on values on the provided `TagHelperDirectiveDescriptor`s.

Modify tests to use new `ITagHelperDescriptorResolver` signature.
- Updated all of the tests to use the new `ITagHelperDescriptorResolver` signature so instead of passing strings they now construct `TagHelperDescriptorResolutionContext`s.
- Removed several tests from the `AddOrRemoveTagHelperSpanVisitorTest`s. This was due to the change in responsibility of managing the found `TagHelperDescriptor`s; the `TagHelperDescriptorResolver` now does this.
- Added several new tests to verify the `TagHelperDescriptorResolver` manages resolved `TagHelperDescriptor`s based on the given `TagHelperDirectiveDescriptor`s.

#214

Part 1 PR: #218

/cc @yishaigalatzer @dougbu @pranavkm 
also, less important, specific `null` checks of `string` values make reader look around to determine what an empty `string` means.  though empty `string` in this case causes an error before this check is reached, probably still better to use `string.IsNullOrEmpty()`.