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.
#include "ExternalQueryBuilder.h"
#include <boost/range/join.hpp>
#include <IO/WriteBuffer.h>
#include <IO/WriteBufferFromString.h>
#include <IO/WriteHelpers.h>
#include <Dictionaries/DictionaryStructure.h>
namespace DB
{
static inline void writeParenthesisedString(const String & s, WriteBuffer & buf)
{
    writeChar('(', buf);
    writeString(s, buf);
    writeChar(')', buf);
}
namespace ErrorCodes
{
    extern const int UNSUPPORTED_METHOD;
    extern const int LOGICAL_ERROR;
}
static constexpr std::string_view CONDITION_PLACEHOLDER_TO_REPLACE_VALUE = "{condition}";
ExternalQueryBuilder::ExternalQueryBuilder(