Refactor extension to webpack

This change is the biggest in the history of the project. The entire
project has been refactored so it is built with webpack.

This involves:
- Creating webpack and npm config files.
- Fixing some bugs in the code due to the fact that webpack uses strict
mode.
- Merging some pieces of code which were shared throughout the codebase
(not exhaustive, more work should be done in this direction).
- Splitting the console_inject.js file into separate files (it had 1000+
lines).
- Adapting all the build-related files (Makefile, bash scripts, etc.)
- Changing the docs to explain the new build process.
- Changing the Zuul playbook/roles to adapt to the new build process.

Change-Id: I16476d47825461c3a318b3f1a1eddb06b2df2e89
diff --git a/src/common/optionsPrototype.json5 b/src/common/optionsPrototype.json5
new file mode 100644
index 0000000..191d0e1
--- /dev/null
+++ b/src/common/optionsPrototype.json5
@@ -0,0 +1,121 @@
+{
+  // Available options:
+  'list': {
+    defaultValue: true,
+    context: 'options',
+  },
+  'thread': {
+    defaultValue: true,
+    context: 'options',
+  },
+  'threadall': {
+    defaultValue: false,
+    context: 'options',
+  },
+  'fixedtoolbar': {
+    defaultValue: false,
+    context: 'options',
+  },
+  'redirect': {
+    defaultValue: false,
+    context: 'options',
+  },
+  'history': {
+    defaultValue: false,
+    context: 'options',
+  },
+  'loaddrafts': {
+    defaultValue: false,
+    context: 'options',
+  },
+  'increasecontrast': {
+    defaultValue: false,
+    context: 'options',
+  },
+  'stickysidebarheaders': {
+    defaultValue: false,
+    context: 'options',
+  },
+  'profileindicator': {
+    defaultValue: false,
+    context: 'options',
+  },
+  'profileindicatoralt': {
+    defaultValue: false,
+    context: 'options',
+  },
+  'profileindicatoralt_months': {
+    defaultValue: 12,
+    context: 'options',
+  },
+  'ccdarktheme': {
+    defaultValue: false,
+    context: 'options',
+  },
+  'ccdarktheme_mode': {
+    defaultValue: 'switch',
+    context: 'options',
+  },
+  'ccforcehidedrawer': {
+    defaultValue: false,
+    context: 'options',
+  },
+  'ccdragndropfix': {
+    defaultValue: false,
+    context: 'options',
+  },
+  'batchlock': {
+    defaultValue: false,
+    context: 'options',
+  },
+  'enhancedannouncementsdot': {
+    defaultValue: false,
+    context: 'options',
+  },
+  'repositionexpandthread': {
+    defaultValue: false,
+    context: 'options',
+  },
+  'disableunifiedprofiles': {
+    defaultValue: false,
+    context: 'options',
+  },
+  'forcemarkasread': {
+    defaultValue: false,
+    context: 'options',
+  },
+
+  // Experiments:
+  'threadlistavatars': {
+    defaultValue: false,
+    context: 'experiments',
+  },
+  'autorefreshlist': {
+    defaultValue: false,
+    context: 'experiments',
+  },
+
+  // Internal options:
+  'ccdarktheme_switch_enabled': {
+    defaultValue: true,
+    context: 'internal',
+  },
+
+  // Deprecated options:
+  'escalatethreads': {
+    defaultValue: false,
+    context: 'deprecated',
+  },
+  'movethreads': {
+    defaultValue: false,
+    context: 'deprecated',
+  },
+  'batchduplicate': {
+    defaultValue: false,
+    context: 'deprecated',
+  },
+  'smei_sortdirection': {
+    defaultValue: false,
+    context: 'deprecated',
+  },
+}