### Is there an existing issue for this?

- [X] I have searched the existing issues

### Current Behavior

when kinesis-mock fails to start (for whatever reason, e.g. a segfault when running the docker image on qemu virtualization), we only get unhelpful error messages from the proxy trying to connect to the backend:

```
2021-07-22T13:30:22:INFO:bootstrap.py: Thread run method <function AdaptiveThreadPool.submit.<locals>._run at 0x7f1e00f299d0>(None) failed: MyHTTPConnectionPool(host='localhost', port=39045): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f1e00f544f0>: Failed to establish a new connection: [Errno 111] Connection refused')) Traceback (most recent call last):
  File "/home/thomas/workspace/localstack/localstack/.venv/lib/python3.8/site-packages/urllib3/connection.py", line 169, in _new_conn
    conn = connection.create_connection(
  File "/home/thomas/workspace/localstack/localstack/.venv/lib/python3.8/site-packages/urllib3/util/connection.py", line 96, in create_connection
    raise err
  File "/home/thomas/workspace/localstack/localstack/.venv/lib/python3.8/site-packages/urllib3/util/connection.py", line 86, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/thomas/workspace/localstack/localstack/.venv/lib/python3.8/site-packages/urllib3/connectionpool.py", line 699, in urlopen
    httplib_response = self._make_request(
  File "/home/thomas/workspace/localstack/localstack/.venv/lib/python3.8/site-packages/urllib3/connectionpool.py", line 394, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/home/thomas/workspace/localstack/localstack/.venv/lib/python3.8/site-packages/urllib3/connection.py", line 234, in request
    super(HTTPConnection, self).request(method, url, body=body, headers=headers)
  File "/usr/lib/python3.8/http/client.py", line 1252, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/lib/python3.8/http/client.py", line 1298, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.8/http/client.py", line 1247, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.8/http/client.py", line 1007, in _send_output
    self.send(msg)
  File "/usr/lib/python3.8/http/client.py", line 947, in send
    self.connect()
  File "/home/thomas/workspace/localstack/localstack/.venv/lib/python3.8/site-packages/urllib3/connection.py", line 200, in connect
    conn = self._new_conn()
  File "/home/thomas/workspace/localstack/localstack/.venv/lib/python3.8/site-packages/urllib3/connection.py", line 181, in _new_conn
    raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x7f1e00f544f0>: Failed to establish a new connection: [Errno 111] Connection refused
```

### Expected Behavior

localstack should gracefully terminate the service proxy, and inform with a log message why kinesis failed to start.

### How are you starting LocalStack?

Custom (please describe below)

### Steps To Reproduce

reproduce by modifying `install_kinesis_mock` to load a bin_file that is not meant to be used for your system.

### Environment

_No response_

### Anything else?

_No response_
"""Recursively apply `func` to `obj` (may be a list, dict, or other object)."""
    obj = func(obj, path=path)
    if isinstance(obj, list):
        for i in range(len(obj)):
            tmp_path = "%s[%s]" % (path or ".", i)
            obj[i] = recurse_object(obj[i], func, tmp_path)
    elif isinstance(obj, dict):
        for k, v in obj.items():
            tmp_path = "%s%s" % ((path + ".") if path else "", k)
            obj[k] = recurse_object(v, func, tmp_path)
    return obj
def keys_to_lower(obj, skip_children_of=None):
    """Recursively changes all dict keys to first character lowercase. Skip children
    of any elements whose names are contained in skip_children_of (e.g., ['Tags'])"""
    skip_children_of = skip_children_of or []
    skip_children_of = (
        skip_children_of if isinstance(skip_children_of, list) else [skip_children_of]
    )
    def fix_keys(o, path="", **kwargs):
        if any([re.match(r"(^|.*\.)%s($|[.\[].*)" % k, path) for k in skip_children_of]):
            return o
        if isinstance(o, dict):
            for k, v in dict(o).items():
                o.pop(k)
                o[first_char_to_lower(k)] = v
        return o
    result = recurse_object(obj, fix_keys)
    return result
def camel_to_snake_case(string):