Improve multiple branch push performance by memoizing permission checking

If you attempt to push thousands of branches at once, the 60-second timeout will occur because GitAccess checking does a lot of work to check if the user has permission to push to a branch. This changes does two things:

  1. Instead of making 1 DB query per branch push, use a memoized list of protected branches to check
  2. Memoize what permissions the user has to perform on this project

On a test of 10,000 branch pushes, this prevents gitlab-shell from hitting the 60-second timeout.

Closes #17225 (closed)

Merge request reports