Regarding your concerns about the utf-8 nature of the attribute values, this is specified in the RFC itself: all string used at the communication level must be utf-8 encoded. When you need to send binary data you must escape it as defined in the RFC. When you're receiving data you get always get two attributes in the response object: the 'value' attribute (that is encoded in utf-8) and the 'raw_value' that is the binary (bytearray object) representation of the data received over the socket, without any transformation. So you can get the data in the format you need.
Regarding the mocking option it should be included as a different communication strategy without much effort.
Now I'm working on a"restartable" strategy to be used in long standing applications (as application and web servers) that should be capable of reconnecting (at the socket layer) when the server is down or network is broken. I'm working on an "ldappool" feature for the same kind of applications.
I would be glad to help you in deciding if python3-ldap is a good option for your project.
Let me know if you need any other information or have any idea on how to enhance the library.
Bye,
Giovanni