Allow nested protocol declarations

Did you meant extension Collection?

// Should this name exist?
let _: Array<Int>.ABC
// Yes it should

// Or should you refer to it like this?
let _: Collection.ABC
// (In current example) Only if `Array<Int>` would have it's own `ABC` that would win, otherwise you can use the above as a shortcut

// What about this? 
// If not, would it be okay for BDC to define its own type called 'ABC'?
let _: BidirectionalCollection.ABC
// DBC can define a custom `ABC` time that would win and it would require you to use `Collection.ABC` if you want to access parents `ABC`

Local type with a colliding name always wins:

struct Foo {}

extension Collection {
  typealias A = Foo
}

struct Test {}

extension Array {
  typealias A = Test
}

let _: Array<Int>.A // Test
let _: BidirectionalCollection.A // Foo

I picked up already a few issues from the previous discussion of your pitch in this thread (had no time to write a formal proposal though, and I have no idea who would be willing to help and implement it):