Use serializable transaction when adding new builds

Serializable transaction isolation level simulates serial transaction
execution, which will ensure that build numbers are unique. One of the
drawbacks of using serializable isolation level is that it can fail with
increased concurrency - that's why it's good to try retrying adding a
new build.