### 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_
return time.time()
def retry(function, retries=3, sleep=1.0, sleep_before=0, **kwargs):
    raise_error = None
    if sleep_before > 0:
        time.sleep(sleep_before)
    for i in range(0, retries + 1):
        try:
            return function(**kwargs)
        except Exception as error:
            raise_error = error
            time.sleep(sleep)
    raise raise_error
def poll_condition(condition, timeout: float = None, interval: float = 0.5) -> bool:
    """
    Poll evaluates the given condition until a truthy value is returned. It does this every `interval` seconds
    (0.5 by default), until the timeout (in seconds, if any) is reached.
    Poll returns True once `condition()` returns a truthy value, or False if the timeout is reached.
    """
    remaining = 0
    if timeout is not None:
        remaining = timeout
    while not condition():
        if timeout is not None:
            remaining -= interval
            if remaining <= 0:
                return False
        time.sleep(interval)
    return True
def merge_recursive(source, destination, none_values=[None]):