Issue title: Is the method MetricRegistry.getOrAdd() threadsafe?
 Issue body: Assume the metrics map doesn't contain a counter named 'Count1'. 
When two threads get into this method simultaneously and the method get() return null.  Then they try to register one new instance under the given name respectively. One will create the metric instance successfully and the other will cause a IllegalArgumentException.

Am I right? Does this method getOrAdd() need to be synchronized?
   ` 
@SuppressWarnings("unchecked")
    private <T extends Metric> T getOrAdd(String name, MetricBuilder<T> builder) {
        final Metric metric = metrics.get(name);
        if (builder.isInstance(metric)) {
            return (T) metric;
        } else if (metric == null) {
            try {
                return register(name, builder.newMetric());
            } catch (IllegalArgumentException e) {
                final Metric added = metrics.get(name);
                if (builder.isInstance(added)) {
                    return (T) added;
                }
            }
        }
        throw new IllegalArgumentException(name + " is already used for a different type of metric");
    }`
 Comments: 
 Comment 0: You're right, but the 2nd thread will catch that IllegalArgumentException [here](https://github.com/dropwizard/metrics/blob/c309a8b55880dc6022e666e7c231d5a897f74140/metrics-core/src/main/java/com/codahale/metrics/MetricRegistry.java#L318), retrieve the counter created by the 1st thread, and return it. Because of this and that the Map in use is a `ConcurrentHashMap`, synchronization is not required.
{'source': 'GithubIssues', 'repo_name_with_owner': 'dropwizard/metrics', 'issue_id': 160846967, 'repo_stars': 6256.0}