-------------------
- added `abc.abstractmethod` decorator where appropriate
- added `stopped` flag to `Session` to indicate that the execution is over,
which is monitored by the `seppl.io.execute(...)` function
- added `wai_logging>=0.0.5` as dependency
- added constants for meta-data types: METADATA_TYPE_STRING, METADATA_TYPE_BOOL, METADATA_TYPE_NUMERIC
- added `load_args` and `save_args` methods for loading args from/saving args to files
- the `execute(...)` method now queries the reader whether it has finished after the first read/yield
to allow for dynamically locating files during first call to `read()` method after initializing the reader
- the `placeholders()` function (package: `seppl.placeholders`) now returns the non-input-based ones
when outputting input-based ones
- added `DataCollector` writer, which just collects all the data and makes it accessible
- introduced `StreamFilter` filters to allow for 1-to-m processing (with m>=0)
- the `MultiFilter` is now a `StreamFilter`
- added `filter_data` generator function and `FilterPipelineIterator` iterator class for
efficiently process data
- the `classes_to_str` and `get_class_name` methods can remove `builtins.` via the clean=True parameter now
- introduced the `InifiniteReader` mixin which automatically disables batch mode
- added support for caching plugins managed by the `ClassRegistry` via the `ClassCache` class (one for each class hierarchy)
- the `execute` method now supports custom pre-initialization and post-finalization method hooks
- filters output the object ID before processing the incoming data when logging level is set to `DEBUG`