MBS-5765: Correctly render a duration in seconds as hours, minutes, seconds

Time::Duration->normalize normalizes a large duration into years, months, and
days - rather than just the needed hours, minutes, seconds. Rather than manually
re-fudging the calculation to account for that overflow, I've just implemented
partioning of seconds in hours, minutes and seconds manually.
MBS-5765: Use the same implementation of FormatTrackLength (Perl) in formatTrackLength (JS)
Fix format_track_length test to correctly check for hours, not days
Use int(x + 0.5) rather than round()

I incorrectly assumed round was present in standard Perl functions, so instead
this now uses the idiom of int(x + 0.5). This works correctly for positive
numbers, but not for negative numbers - however track durations are inherently
positive so this assumption holds.
MBS-3856: Rewrite the query and remove the run time limit

The query now does an array aggregation of all URL link types against a release,
and checks if that array overlaps with the array of link types that can provide
cover art. If there is no overlap, then the release_coverart row is regenerated.

The run time limit has also been removed, as it serves no real purpose (the
transaction boundary is per release).
MBS-5765: Correctly handle edge case where track duration >= 59.5 and < 60 seconds
Merge branch 'mbs-3856' into beta

* mbs-3856:
  MBS-3856: Rewrite the query and remove the run time limit
Merge branch 'mbs-5765' into beta

* mbs-5765:
  MBS-5765: Correctly handle edge case where track duration >= 59.5 and < 60 seconds
  Use int(x + 0.5) rather than round()
  Fix format_track_length test to correctly check for hours, not days
  MBS-5765: Use the same implementation of FormatTrackLength (Perl) in formatTrackLength (JS)
  MBS-5765: Correctly render a duration in seconds as hours, minutes, seconds