Typed static queries

I'm opening this PR so we can discuss the current state of the implementation.
Here's why I'm skeptical about the ConfigHandler implicit:
```
object Foo {
  implicit val config = new ConfigHandler {
    //    override val databaseName = Some("default")
    override val url = Some("jdbc:h2:mem:test1;INIT=runscript from 'slick-testkit/src/codegen/resources/dbs/h2mem/create.sql'\\;runscript from 'slick-testkit/src/codegen/resources/dbs/h2mem/populate.sql'")
    override val jdbcDriver = Some("org.h2.Driver")
  }
}

class TypedStaticQueryTest {

  implicit val config = Foo.config
```
This simple modification will blow up. You could make it work in this case but there are others where you can't (e.g. as soon as you cross compilation unit boundaries). Basically, the implicit promises extra flexibility over an annotation but it cannot actually provide it because those things don't work at compile-time. When you use an annotation instead of an implicit, you are forced to place it at a point in your code where we can be sure that it's available to the macro.