Setup pw_web_ui with Bazel and Jasmine

Initialize the pw_web_ui package and add Bazel as a build system. Add a single example test in `src/transport/web_serial_transport_test.ts` to verify Bazel can build and run Jasmine tests.

HAS_TO_BE_LARGE=Initializing a new package. Most of this is due to yarn.lock.

Change-Id: Ie3adbdba5a91de9a5f16205be8077bafb3a1fee3
diff --git a/WORKSPACE b/WORKSPACE
index 3ac813e..4f0b22a 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -11,3 +11,37 @@
 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 # License for the specific language governing permissions and limitations under
 # the License.
+
+workspace(
+    name = "pigweed",
+    managed_directories = {"@npm": ["node_modules"]},
+)
+
+# Set up build_bazel_rules_nodejs
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+http_archive(
+    name = "build_bazel_rules_nodejs",
+    sha256 = "f9e7b9f42ae202cc2d2ce6d698ccb49a9f7f7ea572a78fd451696d03ef2ee116",
+    urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/1.6.0/rules_nodejs-1.6.0.tar.gz"],
+)
+
+load("@build_bazel_rules_nodejs//:index.bzl", "node_repositories")
+
+node_repositories(package_json = ["//:package.json"])
+
+# Install packages with yarn
+load("@build_bazel_rules_nodejs//:index.bzl", "yarn_install")
+yarn_install(
+    name = "npm",
+    package_json = "//:package.json",
+    yarn_lock = "//:yarn.lock",
+)
+
+# Install Bazel rules from npm packages
+load("@npm//:install_bazel_dependencies.bzl", "install_bazel_dependencies")
+install_bazel_dependencies()
+
+
+# Setup TypeScript
+load("@npm_bazel_typescript//:index.bzl", "ts_setup_workspace")
+ts_setup_workspace()