constructor(value) {
        this.value = value;
        this._lower = value.toLowerCase();
    }
**!Do not construct directly!**

**!Only static methods because it gets serialized!**

This represents the "canonical" version for an extension identifier. Extension ids
have to be case-insensitive (due to the marketplace), but we must ensure case
preservation because the extension API is already public at this time.

For example, given an extension with the publisher `"Hello"` and the name `"World"`,
its canonical extension identifier is `"Hello.World"`. This extension could be
referenced in some other extension's dependencies using the string `"hello.world"`.

To make matters more complicated, an extension can optionally have an UUID. When two
extensions have the same UUID, they are considered equal even if their identifier is different.