restructure exceptions to use a common interface

instead of a common abstract class to better leverage specific SPL exceptions