Make GenericCollectionAssertion work better for strings

The collection assertions fall down in some cases where the collection is IEnumerable<string>, notably interpreting a single expected string as IEnumerable<char> or using the 'reason' parameter as an expected value.

I've specialized Should() for IEnumerable<string> and modified the assertion methods to work more intuitively for strings.

I had to change one of the tests for collections, because it was using strings and relying on the broken behavior. I don't think the changes should break the behaviour of the methods generally, other than from unexpected to less-unexpected.

See what you think.
Cheers.