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 
> Is the purpose of this test to ensure uncaught errors are eventually caught?

Yes. The test was failing when the try-catch block was not in place.

If there isn't an easy way how to write a test for that, then I can live without it.

However, please change the test name "returns error when the test crashes" to match the intent of the test, e.g. "returns descriptive error when the datasource was not found", and also remove the comments that are no longer relevant.