Rework filter implementation

* add documentation
* tweak tests
* rework filter implementation to allow developers to subclass S
  and provide support for filters ElasticUtils doesn't natively
  support