function convertMessageToCtc(lhlMessage, examples = {}) {
  _lhlValidityChecks(lhlMessage);

  /** @type {IncrementalCtc} */
  const ctc = {
    message: lhlMessage,
    placeholders: {},
  };

  // Process each placeholder type
  _processPlaceholderMarkdownCode(ctc);

  _processPlaceholderMarkdownLink(ctc);

  _processPlaceholderCustomFormattedIcu(ctc);

  _processPlaceholderDirectIcu(ctc, examples);

  _ctcValidityChecks(ctc);

  return ctc;
}
Take a series of LHL format ICU messages and converts them
to CTC format by replacing {ICU} and `markdown` with
$placeholders$. Functional opposite of `bakePlaceholders`. This is commonly
called as one of the first steps in translation, via collect-strings.js.

Converts this:
messages: {
 "core/audits/seo/canonical.js | explanationDifferentDomain" {
   "message": "Points to a different domain ({url})",
   },
 },
}

Into this:
messages: {
 "core/audits/seo/canonical.js | explanationDifferentDomain" {
   "message": "Points to a different domain ($ICU_0$)",
   "placeholders": {
     "ICU_0": {
       "content": "{url}",
       "example": "https://example.com/"
     },
   },
 },
}

Throws if the message violates some basic validity checking.

@param {string} lhlMessage
@param {Record<string, string>} examples
@return {IncrementalCtc}