Project: support custom name in createFromTemplate

Add an optional `name` parameter to Project.createFromTemplate()
to better support yeoman generator workflow, which does not
require the project name to match the directory name.
Project: support custom fs.writeFile

Modify all Project methods working with files to use `Project.writeFile`
instead of `fs.writeFile`. This allows consumers to provide they custom
function for writing files, e.g. yeoman generator's `this.write`.
Define more schema properties

model-definition
  dataSource: String
  public: Boolean

datasource-definition
  defaultForType: String
  connector: String

The properties are defined in such order that Project.loadFromFiles
followed by Project.saveToFiles will preserve the JSON files created
from templates.
datasource: validate uniqueness of name