There appears to be a race condition when multiple threads invoke `GenericProxy.create_ssl_cert` when using `USE_SSL=1`. It causes a cascading failure of the service as shown by the following logs.

```
[36mlocalstack_1                  |[0m 2019-11-27T18:59:49:ERROR:localstack.services.generic_proxy: Exception running proxy on port 4576: [SSL] PEM lib (_ssl.c:3503) Traceback (most recent call last):
[36mlocalstack_1                  |[0m   File "/opt/code/localstack/localstack/services/generic_proxy.py", line 386, in run_cmd
[36mlocalstack_1                  |[0m     server_side=True, certfile=combined_file)
[36mlocalstack_1                  |[0m   File "/usr/lib/python3.6/ssl.py", line 1158, in wrap_socket
[36mlocalstack_1                  |[0m     ciphers=ciphers)
[36mlocalstack_1                  |[0m   File "/usr/lib/python3.6/ssl.py", line 750, in __init__
[36mlocalstack_1                  |[0m     self._context.load_cert_chain(certfile, keyfile)
[36mlocalstack_1                  |[0m ssl.SSLError: [SSL] PEM lib (_ssl.c:3503)
[36mlocalstack_1                  |[0m 
[36mlocalstack_1                  |[0m 2019-11-27T18:59:49:ERROR:localstack.services.generic_proxy: Exception running proxy on port 4569: [SSL] PEM lib (_ssl.c:3503) Traceback (most recent call last):
[36mlocalstack_1                  |[0m   File "/opt/code/localstack/localstack/services/generic_proxy.py", line 386, in run_cmd
[36mlocalstack_1                  |[0m     server_side=True, certfile=combined_file)
[36mlocalstack_1                  |[0m   File "/usr/lib/python3.6/ssl.py", line 1158, in wrap_socket
[36mlocalstack_1                  |[0m     ciphers=ciphers)
[36mlocalstack_1                  |[0m   File "/usr/lib/python3.6/ssl.py", line 750, in __init__
[36mlocalstack_1                  |[0m     self._context.load_cert_chain(certfile, keyfile)
[36mlocalstack_1                  |[0m ssl.SSLError: [SSL] PEM lib (_ssl.c:3503)
[36mlocalstack_1                  |[0m 
[36mlocalstack_1                  |[0m 2019-11-27T18:59:49:INFO:localstack.multiserver: Starting multi API server process on port 51492
[36mlocalstack_1                  |[0m 2019-11-27T18:59:49:ERROR:localstack.services.generic_proxy: Exception running proxy on port 4568: [SSL] PEM lib (_ssl.c:3503) Traceback (most recent call last):
[36mlocalstack_1                  |[0m   File "/opt/code/localstack/localstack/services/generic_proxy.py", line 386, in run_cmd
[36mlocalstack_1                  |[0m     server_side=True, certfile=combined_file)
[36mlocalstack_1                  |[0m   File "/usr/lib/python3.6/ssl.py", line 1158, in wrap_socket
[36mlocalstack_1                  |[0m     ciphers=ciphers)
[36mlocalstack_1                  |[0m   File "/usr/lib/python3.6/ssl.py", line 750, in __init__
[36mlocalstack_1                  |[0m     self._context.load_cert_chain(certfile, keyfile)
[36mlocalstack_1                  |[0m ssl.SSLError: [SSL] PEM lib (_ssl.c:3503)
[36mlocalstack_1                  |[0m 
[36mlocalstack_1                  |[0m 2019-11-27T18:59:49:ERROR:localstack.services.generic_proxy: Exception running proxy on port 4586: [SSL] PEM lib (_ssl.c:3503) Traceback (most recent call last):
[36mlocalstack_1                  |[0m   File "/opt/code/localstack/localstack/services/generic_proxy.py", line 386, in run_cmd
[36mlocalstack_1                  |[0m     server_side=True, certfile=combined_file)
[36mlocalstack_1                  |[0m   File "/usr/lib/python3.6/ssl.py", line 1158, in wrap_socket
[36mlocalstack_1                  |[0m     ciphers=ciphers)
[36mlocalstack_1                  |[0m   File "/usr/lib/python3.6/ssl.py", line 750, in __init__
[36mlocalstack_1                  |[0m     self._context.load_cert_chain(certfile, keyfile)
[36mlocalstack_1                  |[0m ssl.SSLError: [SSL] PEM lib (_ssl.c:3503)
[36mlocalstack_1                  |[0m 
```

`common.generate_ssl_cert` has some `os.path.exists` checks while later multiple independent `save_file` calls. These look like they might race and cause the 3 ssl files to become invalid. 
for t in threading.enumerate():
        print(t)
    print(run("ps aux | grep 'node\\|java\\|python'"))
def merge_recursive(source, destination):
    for key, value in source.items():
        if isinstance(value, dict):
            
            node = destination.setdefault(key, {})
            merge_recursive(value, node)
        else:
            if not isinstance(destination, dict):
                LOG.warning('Destination for merging %s=%s is not dict: %s' %
                    (key, value, destination))
            destination[key] = value
    return destination
def merge_dicts(*dicts, **kwargs):
    """ Merge all dicts in `*dicts` into a single dict, and return the result. If any of the entries
        in `*dicts` is None, and `default` is specified as keyword argument, then return `default`. """
    result = {}
    for d in dicts:
        if d is None and 'default' in kwargs:
            return kwargs['default']
        if d:
            result.update(d)
    return result
def recurse_object(obj, func, path=''):