SI-4788/SI-5948 Respect RetentionPolicy of Java annotations

I wonder if we should switch over to deconstructing `AnnotationInfo.tree` now.

```scala
scala> class C { @scala.reflect.ScalaLongSignature(bytes = Array[Byte]()) def foo = "" }
defined class C
warning: previously defined object C is not a companion to class C.
Companions must be defined together; you may wish to use :paste mode for this.

scala> val foo = typeOf[C].member(TermName("foo"))
foo: $r.intp.global.Symbol = method foo

scala> val annot = foo.annotations.head
annot: $r.intp.global.AnnotationInfo = scala.reflect.ScalaLongSignature(bytes = [])

scala> val atp = annot.atp
atp: $r.intp.global.Type = scala.reflect.ScalaLongSignature

scala> val treeInfo.Applied(_, _, ((AssignOrNamedArg(Ident(`nme`.value), Literal(Constant(cls: Symbol))) :: Nil) :: Nil)) = atp.typeSymbol.initialize.getAnnotation(symbolOf[java.lang.annotation.Retention]).get.tree
cls: $r.intp.global.Symbol = value RUNTIME
```

I wonder if this we could also try to extract some generally useful combinator from this and implement in terms of that.