Don't silently swallow errors in the Python client

The Python API client silently swallows errors, which makes it impossible to tell what went wrong when sending a message fails. Instead, the library should allow errors to bubble up so that calling libraries can decide what to do with the error.