I like the concept, but I simply can't understand why you named it IMessage. A message should be passive. It is not describing an action, but content. Or: IAction<TResponseMessage, TRequestMessag...
static class ThreadLocalServiceLocator public static bool IsLoaded { get { return instances.Any(); } } failing because instances is null. [ThreadStatic] private static ...
When converting between types it's sometimes preferable to use a different culture than the current one. The attached patch allows this.
It would be a great plus to have documentation for Umbrella, perhaps even just a few examples? It should be included in the package zip file