message: gltfpack: Refactor top-level extension handling
  Instead of hardcoding KHR_lights_punctual as the only top-level
  extension, split it into a separate JSON blob.
  This will make adding support for other top-level extensions like
  KHR_xmp easier.
diff: @@ -361,7 +361,7 @@ static void process(cgltf_data* data, const char* input_path, const char* output
  std::vector<std::string> json_roots(data->scenes_count);
  std::string json_animations;
  std::string json_cameras;
  - std::string json_lights;
  + std::string json_extensions;
  std::vector<BufferView> views;
  @@ -633,11 +633,19 @@ static void process(cgltf_data* data, const char* input_path, const char* output
  writeCamera(json_cameras, camera);
  }
  + if (data->lights_count > 0)
  + {
  + comma(json_extensions);
  + append(json_extensions, "\"KHR_lights_punctual\":{\"lights\":[");
  +
  for (size_t i = 0; i < data->lights_count; ++i)
  {
  const cgltf_light& light = data->lights[i];
  - writeLight(json_lights, light);
  + writeLight(json_extensions, light);
  + }
  +
  + append(json_extensions, "]}");
  }
  append(json, "\"asset\":{");
  @@ -690,19 +698,19 @@ static void process(cgltf_data* data, const char* input_path, const char* output
  writeArray(json, "cameras", json_cameras);
  - if (!json_lights.empty())
  - {
  - append(json, ",\"extensions\":{\"KHR_lights_punctual\":{\"lights\":[");
  - append(json, json_lights);
  - append(json, "]}}");
  - }
  -
  if (data->scene)
  {
  append(json, ",\"scene\":");
  append(json, size_t(data->scene - data->scenes));
  }
  + if (!json_extensions.empty())
  + {
  + append(json, ",\"extensions\":{");
  + append(json, json_extensions);
  + append(json, "}");
  + }
  +
  if (settings.verbose)
  {
  printMeshStats(meshes, "output");
  