FEATURE: Cook drafts excerpt in user activity (PR #14315)

The previous excerpt was a simple truncated raw message. Starting with this commit, the raw content of the draft is cooked and an excerpt is extracted from it. The logic for extracting the excerpt mimics the the ExcerptParser class, but does not implement all functionality, being a much simpler implementation.


Any reasons not to use forEach instead?

element.childNodes.forEach(child => traverse(child, callback))

Hmm, those routes should probably all be plurals?

LGTM :+1:

The plugins frontend test failure is legit. I have a PR ready for it discourse/discourse-encrypt#135.