Disambiguate routing for multi-level repository names

    Disambiguate routing for multi-level repository names

    To be able to support multi-level repository names, the API has been adjusted
    to disabiguate routes tagged image manifest routes and tag list routes. With
    this effort, the regular expressions have been defined in a single place to
    reduce repitition and ensure that validation is consistent across the registry.

    The router was also refactored to remove the use of subrouters, simplifying the
    route definition code. This also reduces the number of regular expression match
    checks during the routing process.

    We also added regular expression definitions for several string identifiers
    used throughout the registry. The repository name regex supports up to five path
    path components and restricts repeated periods, dashes and underscores. The tag
    regex simply validates the length of the tag and that printable characters are
    required.

    Though we define a new package common, these definitions should land in docker
    core.