First question: the jump opcode, jmp @label actually works by adding a certain amount to ip. Similarly, you can do jmp ax (which sets ip to ax), jmp [bx] (which sets ip to what's stored in [bx]) or jmp far [bx] (which, if I recall correctly, also sets cs to [bx+2]).
Second qeustion: any address in 8086 is always represented by a pair segment:offset, which is than translated into an absolute address by segment*0x10+offset. This has the advantage of allowing you to access 2^20 possible addresses on a 16-bit machine (so you are not limited to 2^16, as you should have been). The current instruction is kept in a similar fashion – your address is cs:ip, where cs is the segment register and ip is the offset within that segment.
Note that a lot of far-call based survivors use the fact that many segments overlap to operate from segments different from the initial arena segment, 0x1000. Instead, they use an offset in an almost completely overlapping segment such as 0x1010 and make sure that they never enp up out of the arena when the actual physical address is calculated. This is used in order to hide their actual address and make finding them musch more difficult for scanners.