Reduce memory usage.
Rework Extractor.

* Pass a functor capable of building the user expected result list.
This removes the need for an implementation defined result structure
that usually is just temporary. This way, we can directly build the
final structure. Hence reducing the number of allocation and memory
usage.
* Simplify some internal structures.