refactor error message for filters
store filters in a hash to simplify implementation

This fixes #2507 and adds tests to ensure that's the case.

When using a hash it's simple to write over an existing filter, and
it's easy to avoid that when adding the default filters in.

Before this commit there was a array of filters that we'd just append,
and later only use the last of for each filter name.