## Problem
Currently, even if `LAMBDA_REMOTE_DOCKER=1`, we unzip the zip files in the directory they are in, which is usually /var/lib/localstack, which usually has a bind mount to the host.
On docker desktop, due to the use of grpc-FUSE (on macos), this can be very slow, about 200 times slower than on volumes / directly on the host. With experimental virtio filesystem enabled (also on macos), this can be reduced to about 30 times as slow, but still problematic.
This means a lambda may take a lot of time processing, for each additional layer some more. This especially affects nodejs lambdas with huge node_modules folders.

## Probable solution
At least if `LAMBDA_REMOTE_DOCKER=1`, we should leave the initial zip files on the bind mount (for persistence etc), but the working directories after unzipping should be located on non-bind mounts, to speed up the IO for unzipping.
HOOKS_ON_LAMBDA_DOCKER_REUSE_CONTAINER_CREATION = (
    "localstack.hooks.on_docker_reuse_container_creation"
)
on_docker_separate_execution = hook_spec(HOOKS_ON_LAMBDA_DOCKER_SEPARATE_EXECUTION)
on_docker_reuse_container_creation = hook_spec(HOOKS_ON_LAMBDA_DOCKER_REUSE_CONTAINER_CREATION)
class InvocationException(Exception):
    def __init__(self, message, log_output=None, result=None):
        super(InvocationException, self).__init__(message)
        self.log_output = log_output
        self.result = result
class LambdaContext:
    DEFAULT_MEMORY_LIMIT = 1536
    def __init__(
        self, lambda_function: LambdaFunction, qualifier: str = None, context: Dict[str, Any] = None
    ):
        context = context or {}
        self.function_name = lambda_function.name()
        self.function_version = lambda_function.get_qualifier_version(qualifier)
        self.client_context = context.get("client_context")
        self.invoked_function_arn = lambda_function.arn()
        if qualifier:
            self.invoked_function_arn += ":" + qualifier
        self.cognito_identity = context.get("identity") and select_attributes(
            context.get("identity"), ALLOWED_IDENTITY_FIELDS
        )
        self.aws_request_id = str(uuid.uuid4())
        self.memory_limit_in_mb = lambda_function.memory_size or self.DEFAULT_MEMORY_LIMIT
        self.log_group_name = f"/aws/lambda/{self.function_name}"
        self.log_stream_name = f"{timestamp(format='%Y/%m/%d')}/[1]{short_uid()}"
    def get_remaining_time_in_millis(self):