perf: use a dict for linked package store directory membership checks (#2908)

The 'not in' check against a list is O(direct deps) for each entry in
the transitive npm_package_store_infos of the package, making the
linking loop quadratic for packages with many deps.

### Changes are visible to end-users:no

### Test plan

- Covered by existing test cases
diff --git a/npm/private/npm_package_store.bzl b/npm/private/npm_package_store.bzl
index caf7b23..b0ef024 100644
--- a/npm/private/npm_package_store.bzl
+++ b/npm/private/npm_package_store.bzl
@@ -282,7 +282,8 @@
                     verbose = ctx.attr.verbose,
                 )
 
-        linked_package_store_directories = []
+        # dict of linked package store directories for fast membership checks below
+        linked_package_store_directories = {}
         for dep, _dep_aliases in ctx.attr.deps.items():
             dep_info = dep[NpmPackageStoreInfo]
             dep_aliases = _dep_aliases.split(",") if _dep_aliases else [dep_info.package]
@@ -295,7 +296,7 @@
                 fail(msg)
 
             if dep_package_store_directory:
-                linked_package_store_directories.append(dep_package_store_directory)
+                linked_package_store_directories[dep_package_store_directory] = True
                 for dep_alias in dep_aliases:
                     target = dep_package_store_directory.short_path[package_store_prefix_len:]
                     files.append(_symlink_package_store(ctx, package_store_name, target, dep_alias))