I am feeling like we might be going a little overkill on some of the hierarchy here. Is there a use case you can think of to split exceptions by whether they were remote related or client related? I think the names of the subclasses already communicate that information.

In general, I think it becomes taxing to developers when there are a lot of classes that are nested like this, because they have to go read each superclass to see what it is and what it does. Sometimes this tax is worth it, but I think here we are probably going overboard. It's easy to add layers later when we need them, so I'd rather not start out with so deep of a hierarchy, personally.