Typed throw functions

Note that this equivalence between rethrows and generic thrown types is invalid, due to eg. this function, which is valid today:

struct Err: Error {}
func myMap<T, U> (x: T, f: (T) throws -> U) rethrows -> U {
  do {
    return try f(x)
  } catch {
    throw Err()
  }
}