```ts
import { strict as assert } from 'assert';

export function pickLane(queues: number[], closed: number[]): number {
  if (!Array.isArray(queues) || queues.length === 0) {
    throw new Error('Invalid input: queues must be a non-empty list');
  }

  if (typeof queues[0] !== 'number' || !Number.isInteger(queues[0])) {
    throw new Error('Invalid input: queues must contain only non-negative integers');
  }

  if (!Array.isArray(closed) || closed.length === 0) {
    throw new Error('Invalid input: closed must be a non-empty list');
  }

  if (typeof closed[0] !== 'number' || !Number.isInteger(closed[0])) {
    throw new Error('Invalid input: closed must contain only integers');
  }

  const openLanes = queues.filter(lane => !closed.includes(lane));

  if (openLanes.length === 0) {
    throw new Error('All lanes are closed');
  }

  let bestLane = openLanes[0];
  let minPeople = openLanes[0];

  for (let lane of openLanes) {
    if (lane < minPeople || (lane === minPeople && lane > bestLane)) {
      bestLane = lane;
      minPeople = lane;
    }
  }

  return bestLane;
}

// Test cases
assert.strictEqual(pickLane([1, 2, 3], []), 0);
assert.strictEqual(pickLane([4, 5, 6], [1]), 2);
assert.strictEqual(pickLane([7, 8, 9], [2, 3]), 1);
assert.strictEqual(pickLane([10, 11, 12], [0, 1, 2]), 0);
assert.strictEqual(pickLane([], []), -1); // Should throw an error
assert.strictEqual(pickLane([1, 2, 3], [1, 2]), -1); // Should throw an error
assert.strictEqual(pickLane([4, 5, 6], [3, 4]), -1); // Should throw an error
assert.strictEqual(pickLane([7, 8, 9], [0, 1, 2]), -1); // Should throw an error
assert.strictEqual(pickLane([10, 11, 12], [0, 1, 2]), -1); // Should throw an error
```