Thread safety for SEO redirect caching
Added function to split name into (most likely) first name and last name
Improvements to EncodeStringDictionary

It accepts an IDictionary instead of Dictionary so as to support
SortedDictionary, ConcurrentDictionary, etc.

Also now uses the correct EncodeUriData instead of EncodeUriString
Added heuristics to determine whether or not an email address is valid
Invalid domains don't repeat enough to make it worth caching them
Email filter optimizations and improvements
Handle null strings better in SplitName
Don't rely on caller to provide lower-cased email address
Compatible with new AWS restriction that requires subdomain for S3 links
Fixed crash on null/empty string
Added DictionaryExtensions class

Contains Dictionary extension method SafeLookup which provides an option of
specifying what is returned when a lookup fails, like TryGetValue but with
an explicit alternative (vs TValue default).
Merge pull request #1 from neosmart/master

merge code