text: Title: Allowing `UsageError` subclasses
  Body: Hi,
  
  I'm developing a package that exposes magic commands to users. In many cases, the Python traceback is long and uninformative so I only want to display an appropriate error message.
  
  I noticed that this can be done with [`UsageError`](https://github.com/ipython/ipython/blob/a3d5a06d9948260a6b08c622e86248f48afd66c3/IPython/core/interactiveshell.py#L2086) since the shell will hide the traceback. However, some errors we want to display are not really "usage errors" so we want to provide alternative names.
  
  Unfortunately, subclassing `UsageError` doesn't work: 
  
  ![image](https://user-images.githubusercontent.com/989250/233441989-6e0aaa80-0cb9-42c1-85e0-8a61f694906e.png)
  
  Because the code is checking for the `UsageError` type: https://github.com/ipython/ipython/blob/a3d5a06d9948260a6b08c622e86248f48afd66c3/IPython/core/interactiveshell.py#L2086
  
  Checking for subclasses instead would fix the issue. Another approach would be defining a `HideTracebackError`, and `UsageError` could be a subclass of it, then, the checking condition could verify if the exception is `HideTracebackError` or a subclass.
  
   I believe this is a common scenario among packages that expose magics to users and can greatly improve user experience.
  
  I'm happy to open a PR if the maintainers accept this change.
  