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

Part of the reason of going through this overhaul is that I think I'm going to use a similar model for queries which are a bigger issue since queries often have a lot of arguments.

r?