text: Title: Enhancement request: async execution for a non-defined function
  Body: ## Context
  My use case is to be able to execute a function ("task") using the async execution in a different lambda. That lambda has a different code base than the calling lambda. In other words, the function ("task") to be executed is not defined in the calling lambda.
  The async execution lets you specify a remote lambda and remote region but the function (to be executed) has to be defined in the code. The request is to be able to simply provide a function name as a string in the form of <module_name>.<function_name>.
  This obviously does not work for the decorator. It works only using "zappa.async.run".
  
  ## Expected Behavior
  The below should work:
  `
  from zappa.async import run
  
  run(func="my_module.my_function", remote_aws_lambda_function_name="my_remote_lambda", remote_aws_region='us-east-1', kwargs=kwargs)
  `
  
  ## Actual Behavior
  The function/task path is retrieved via inspection (hence requires a function type) by "get_func_task_path"
  
  ## Possible Fix
  This is a bit hackish but is the least intrusive. I'll make a PR but I'm thinking of:
  `
  def get_func_task_path(func):
  
      """
      Format the modular task path for a function via inspection if param is
      a function. If the param is of type string, it will simply return it. 
      """
  
      if isinstance(func , (str, unicode)):
          return func
  
      module_path = inspect.getmodule(func).__name__
  
      task_path = '{module_path}.{func_name}'.format(
                                          module_path=module_path,
                                          func_name=func.__name__
                                      )
  
      return task_path
  `
  
  