test for invalid language factored out to GetCultureInfoFromLanguage; no need to convert culture tolower here as only place used is in GetCacheKey (which tolowers it) and filesystem ops; changed text lookup return values to null rather than key as latter can be ambiguous when translation equals key.
Further improved concurrency of access to message cache. ConcurrentDictionary<> offers concurrent (lock free) reads whereas, I believe, Dictionary<> doesn't.
Introducing LanguageTag class
Added LanguageMatching setting; some tidying up
LanguageMatching support classes added; some tidying up; fixed build config issue where Debug build was in fact building Release config.