**Major changes**
- The TransportLayer handle its own timing by running an internal thread. No need to call ``process`` anymore
- The user provided ``rxfn`` is expected to be blocking and respect a timeout passed as an argument. CPU throttling will be applied by calls to ``sleep()`` if the given timeout is not respected.
- ``squash_stmin_requirement`` has been replaced by ``override_receiver_stmin``
- Many internal methods/properties have been prefixed with an underscore to indicates that they are internal
- The error handler is called from a different thread.
- The isotp.socket.recv does not return None on Timeout anymore
- Minimal Python version is 3.7
- ``isotp.socket.bind`` now requires an ``isotp.Address`` object and is no more backward compatible with old interface
**Improvements**
- Timing behaviors has been globally improved. The pure python implementation running in the user space is able to reach similar timings as the kernel module when running on a vcan interface
- Blocking sends are now possible
- Added ``NotifierBasedCanStack`` which is an improved version of the CanStack object using a can.Notifier improving performances and avoiding starvation of other readers.
- Asymmetric addressing is possible, meaning sending and receiving with different address schemes
- ConsecutiveFrame wait period can be achieved by a user-passed function (default to time.sleep)
- Possible to send data using a generator
- Test suite is more robust
- Type hints are coupled with the code
**Bugfix**
- Fixed missing parameter check in ``Address``
- Receiving a wait frame when wftmax is set to 0 triggers the error handle only when reception is not idle.