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. 
import shutil
import requests
import dns.resolver
from io import BytesIO
from contextlib import closing
from datetime import datetime
from six import with_metaclass
from six.moves import cStringIO as StringIO
from six.moves.urllib.parse import urlparse
from multiprocessing.dummy import Pool
from localstack import config
from localstack.config import DEFAULT_ENCODING
from localstack.constants import ENV_DEV
from localstack.utils import bootstrap
from localstack.utils.bootstrap import FuncThread
TMP_FILES = []
TMP_THREADS = []
TMP_PROCESSES = []
CACHE_CLEAN_TIMEOUT = 60 * 5
CACHE_MAX_AGE = 60 * 60
CACHE_FILE_PATTERN = os.path.join(tempfile.gettempdir(), '_random_dir_', 'cache.*.json')
last_cache_clean_time = {'time': 0}
mutex_clean = threading.Semaphore(1)
TIMESTAMP_FORMAT = '%Y-%m-%dT%H:%M:%S'
TIMESTAMP_FORMAT_MILLIS = '%Y-%m-%dT%H:%M:%S.%fZ'
CODEC_HANDLER_UNDERSCORE = 'underscore'
DOWNLOAD_CHUNK_SIZE = 1024 * 1024
LOG = logging.getLogger(__name__)
INFRA_STOPPED = False
class CustomEncoder(json.JSONEncoder):