Use of custom query/placeholder for external dictionaries.
The `placeholder` is similar to `update_field`

Current implementation supports only simple table field like 
`SOURCE(CLICKHOUSE(... update_field 'added_time' update_lag 15))`
but miss support for complex/compound expressions (that for example could use index more efficiently).

Example: 
query = "
    ....
    from t1
    where :placeholder between col1 and col2 and col3=42
    "
invalidate_query=
placeholder_query = "select max(col1) from t1 ...",
placeholder_init_str = "toDateTime('1970-01-01')"

So initial value of placeholder is calculated from `placeholder_init_str`,
next value from `invalidate_query`
and could be used in query.

By introducing this feature work with dictionary sources will be more flexible and general.
const Columns & key_columns, const std::vector<size_t> & requested_rows, LoadKeysMethod method, size_t partition_key_prefix) const
{
    if (!dict_struct.key)
        throw Exception(ErrorCodes::UNSUPPORTED_METHOD, "Composite key required for method");
    if (key_columns.size() != dict_struct.key->size())
        throw Exception(ErrorCodes::LOGICAL_ERROR, "The size of key_columns does not equal to the size of dictionary key");
    WriteBufferFromOwnString out;
    if (query.empty())
    {
        writeString("SELECT ", out);
        auto first = true;
        for (const auto & key_or_attribute : boost::join(*dict_struct.key, dict_struct.attributes))
        {
            if (!first)
                writeString(", ", out);
            first = false;
            if (!key_or_attribute.expression.empty())
            {
                writeParenthesisedString(key_or_attribute.expression, out);
                writeString(" AS ", out);
            }
            writeQuoted(key_or_attribute.name, out);
        }
        writeString(" FROM ", out);
        if (!db.empty())
        {