Refactoring Zengine

Goal is: migrate Z from being a _static_ execution context => becoming a instance one.

This might include migrating things out of Z (i.e to Zengine) to keep it abstract parent for Q,L and other family.
Idea is to keep API as simple as possible:

```java
//Using plain vanilla DI
Zengine z = new Zengine(new ZeppelingDriver(), new ZeppelinConfiguration()); 
//could be hidden in default constructor

result = new Q("select text from myTable", z)  // load some data
                      .pipe(new L("wordcount"), z)     // load wordcount library
                      .execute()                            // execute
                      .result();

result.write(System.out);                             // Print result to stdout
```

TODO:
 - [ ] open\close connection per appropriate scope i.e per statement or per Job
 - [ ] fix unit tests
 - [ ] update ZeppelinConfiguration - should be injected explicitly in consumers (need shorter methods too)
 - [ ] clean-up DI: not everyone needs Zengine - i.e Z does not need one