new
* added option to read & write `SignalEntry` with csv file
changed
* moved channel naming and data type inference to separate methods
* simplified `Entry._get_index()` and `Entry.add_entry()`, `CustomAttributes.to_element()`
-> caution: stacked entries will still be removed only partially with `Entry.remove_entry()`
* separate `remove_entry` method for `Unisens` class
* fixed writability of `attrib` when passed at initialization
* setting kwargs always with `set_attrib` independent of passing to `__init__` or `set_data`
* removed cause for exception in `Entry._autosave()`: always have a `_parent` attribute (even when copying)
* removed unreachable code and removed 'return True' where raising exceptions instead of returning False
* refactored paths: no addition of strings, using os.path...
* many minor additions in formatting, typing, comments and docstrings
deprecated
* **`read_unisens`**: will be restricted to internal use
* `SignalEntry.get_data()` **argument `return_type`**: argument is unused and will be removed
* `Entry` subclass **`CustomAttribute`**: no use since it doesn't match `CustomAttributes.add_entry()`; usable alternative is `CustomAttributes.set_attrib()`
* `SignalEntry / ValuesEntry.set_data()` **will require channel names** (deprecating the automatic naming). They can be supplied by passing the argument `ch_names` or by copying and passing the `channel` attribute from another entry. In the future, channels will be used to verify data orientation.