Redesign exception class hierarchy

Fix a design flaw that causes non-virtual diamond inheritance from
std::exception, which MSC16 is not able to handle.
Fix compilation error

Introduced by commit e116c1730e47f00fc4e53d7a0a838838136324cd,
this was missed due to conditional compilation.
Ignore now-useless MSC16 warning

With the new exception class hierarchy, the persistence of this
warning is a bug in MSC16.