Avoid error instantiation if possible on assert.throws

Given an error constructor as function, try to get the error name from its prototype or itself before relying on the old behaviour.

Closes #220

Replaces [the old pull](https://github.com/chaijs/chai/pull/221) to avoid useless commits.