- Introducing a new class `WolframKernelController`. Major code change to ensure ZMQ sockets are isolated in a given thread. Add a new controller class, a `Thread`, that own the sockets connected to the kernel. Interaction with this thread is done through a Queue.
- Merge `WolframLanguageFutureSession` into `WolframLanguageSession`. All evaluate methods have a future counterpart.
- Merge `WolframCloudFutureSession` into `WolframCloudSession`. Add relevant future methods.
- Rename `WolframAPICall` method `add_parameter` to `set_parameter` since setting is exactly what it does.
- Result of API call, the `WolframAPIResponse` family of classes, now automatically deserialize the response content using the content-type, if it's `WXF` or `JSON`. The content type remains accessible in the `response` member of those classes.
- rename evaluator parameters `STARTUP_READ_TIMEOUT` to `STARTUP_TIMEOUT`, and `TERMINATE_READ_TIMEOUT` to `TERMINATE_TIMEOUT`.
- CPU consumption reduced to ~1% with the latest ZMQLink version.
- Local session checks for the Wolfram Kernel version at startup and fails with a specific message.
- Local session supports instant logging for messages, with severity `warn`, and prints, with severity `info`. This only works for kernel with a `kernel_loglevel` set on initialization, and allows real time feedbacks, even if the kernel evaluation is not yet completed.
- Change mapping of WXF symbols to Python objects. The only symbols that are deserialized to Python objects are the one that round trips: `Null`, `True`, `False`. `Pi` and `None` are no more deserialized to, respectively, `math.pi` and `None`.