Refactor discovery to use invokeInWorkspace 

This is a major set of changes and should be released as a minor version.

 - Refactor `invokeInWorkspace()` to support all `dataSource` methods
 - Implement `getSchema()` and `discoverModelDefinition()` using `invokeInWorkspace()`
 - Add new `dataSourceDef.createModel()` to create model definitions + configs using a discovered model definition from `discoverModelDefinition()`

/to @bajtos @raymondfeng 
/cc @seanbrookes 
> It won't always be the third argument.

I know, that's why the code on the following lines is shuffling the arguments around:

```js
var cb = arguments[arguments.length - 1];
if(typeof options === 'function') {
   cb = options;
   options = undefined;
}
```

BTW I believe we use a space after if in `if (`.

Anyways. While the code is unnecessary complicated, it's not a blocker preventing this PR to be landed.