filter: turn Filer back into a struct

This is more flexible and allows to store additional information inside the
struct (see following commits).
filter: introduce new Builder object and implement jump labels

A Builder is used to build Filters from raw instructions. Jump instructions now
take two string arguments representing the labels to jump to instead of the
instruction index. The jump destinations are saved inside the maps in the
Builder object. The Filter is created by calling the Build() method, which
finalizes the filter by resolving all jump labels to the actual jump offsets,
and then returns the Filter.