Write a function `take_n(items, n)` that takes a list `items` and a non-negative integer `n` and returns a new list containing the first `n` elements of `items`. If `n` is greater than the length of `items`, return the entire list. If `n` is 0, return an empty list. Your function must not modify the original list.
Constraints
`items` is a list of any type.
`n` is an integer with `0 <= n <= 1000`.
The length of `items` is at most 1000.
The returned list should be a copy of the slice, not a reference to the original.