Improve thread pool sharing with soft max

Previously, interactive users—especially during bulk operations like
repository syncs—could saturate the entire interactive thread pool,
blocking other users from running their tasks.

While the `maxStartPerUserForTaskForQueue` config could restrict how
many tasks a single user starts, it also limits full pool utilization
when no other users are active.

This change introduces the concept of a soft max, allowing more flexible
and fair sharing of the thread pool:
- A user can exceed softMax if the pool is otherwise idle.
- When new users arrive and start tasks, the original user's share is
  gradually reduced until soft max to make room for others.

This is achieved by ensuring at least two threads are available to start
a task (if the user is beyond the `softMax`), but only one is consumed,
allowing the scheduler to prioritize new users fairly.

This dynamic parking mechanism prevents background-heavy users from
monopolizing the pool, ensuring interactive users aren't blocked and
improving overall responsiveness.

Change-Id: I327416604aeeb36856b1990f0cf89e0a77757e82
10 files changed