Refactor core for better error handling

PR'ing so we can better comment.

First of all this is looking pretty nifty.
Maybe add Error custom name ?
```js
get name() {
  return 'Warning';
}
```