plugin_util: use thread-local Markdown converter (#3491)
plugin_util: use thread-local Markdown converter (#3491)

Summary:
In #3348, we centralized a shared Markdown converter rather than
creating a new one for each call. But this had the effect of sharing the
converter across threads, which is not supported, as the [API docs
helpfully note][1]. This commit splits the globally shared converter
into separate thread-local converters.

[1]: https://python-markdown.github.io/reference/#Markdown

Test Plan:
Prior to this change, some requests would 500 due to internal errors in
the Markdown converter:

```
  File ".../markdown/treeprocessors.py", line 187, in __processPlaceholders
    for child in [node] + list(node):
TypeError: 'NoneType' object is not iterable
```

This was always nondeterministic, but I haven’t been able to reproduce
it with this patch, even hammering the dashboard with a bunch of Chrome
tabs or `curl` requests.

wchargin-branch: threadlocal-markdown-converter

tensorflow/tensorboard,tensorflow/tensorboard,tensorflow/tensorboard,tensorflow/tensorboard,tensorflow/tensorboard,tensorflow/tensorboard,tensorflow/tensorboard