Flowa

@param {Object} flow
@param {String} name (Optional)
function Flowa(flow, name) {

  /**
   * A name for the flow
   * @type {String}
   */
  this.name = typeof name == 'undefined' ? null : name;

  /**
   * The root task
   * @type {Object}
   */
  this._root = flow;

  /**
   * Tasks indexed by their names
   * @type {Object}
   */
  this._tasks = {};

  /**
   * Runners types and their handlers
   * @type {Object}
   */
  this._runners = {serial: serial, parallel: parallel};

  /**
   * The name of the root task
   * @type {Symbol}
   */
  this._rootName = Symbol('__root__');

  /**
   * A mapping between tasks names and runners types
   * @type {Object}
   */
  this._tasksRunnersTypes = {};

  /**
   * A mapping between tasks names and their depth
   * @type {Object}
   */
  this._tasksDepths = {};

  /**
   * A mapping between tasks names and their parent task's name
   * @type {Object}
   */
  this._tasksParents = {};

  /**
   * The default runner type
   * @type {String}
   */
  this._defaultRunnerType = 'serial';

  /**
   * Initialize the Flowa object
   */
  this._init();

}